You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Power Apps中无预定义架构动态处理嵌套JSON

在Power Apps中动态处理任意结构的嵌套JSON数据

我正在开发Power Apps应用,需要动态处理API返回的JSON数据,这些数据包含嵌套对象、数组,且结构会随时间变化,硬编码字段名或手动映射完全不可行。API响应示例如下:

示例1:

{
  "content": [
    {
      "name": "Marywood University",
      "alpha_two_code": "US",
      "domains": ["marywood.edu"],
      "country": "United States",
      "web_pages": ["https://www.google.com/"],
      "state-province": null
    },
    {
      "name": "Lindenwood University",
      "alpha_two_code": "US",
      "domains": ["lindenwood.edu"],
      "country": "United States",
      "web_pages": ["https://www.google.com/"],
      "state-province": null
    }
  ]
}

示例2:

{
  "results": [
    {
      "gender": "female",
      "name": {
        "title": "Ms",
        "first": "Jessica",
        "last": "Perry"
      },
      "location": {
        "street": {
          "number": 8932,
          "name": "Manor Road"
        },
        "city": "Kilcoole",
        "state": "Meath",
        "country": "Ireland"
      },
      "email": "jessica.perry@example.com"
    }
  ]
}

此前尝试过扁平化数据和键值对映射,但遇到Power Apps缺乏原生遍历对象属性的支持,以及动态字段处理时的"Name isn't valid"、"Text function has invalid arguments"等错误。需要实现无需手动调整、适配任意JSON结构的动态处理方案,在画廊或集合中展示数据。


解决方案

1. 动态提取顶层数据数组

首先解析API响应,自动识别顶层的数组字段(比如示例中的content或results):

// 假设API响应存储在变量varAPIResponse中
Set(varParsedJSON, ParseJSON(varAPIResponse));
// 获取顶层所有键
Set(varTopLevelKeys, Keys(varParsedJSON));
// 筛选出值为数组类型的键
Set(varDataArrayKey, First(Filter(varTopLevelKeys, IsType(varParsedJSON[ThisRecord.Value], Table))).Value);
// 提取核心数据数组
Set(varDataArray, varParsedJSON[varDataArrayKey]);

2. 创建递归扁平化自定义函数

通过自定义函数实现嵌套JSON的扁平化,将嵌套键用点分隔(如name.first),数组转成逗号分隔文本:

  1. 进入Power Apps的设置 -> 自定义函数,点击新建函数
  2. 输入函数名称FlattenJSON,添加两个参数:
    • obj:类型选择变体
    • prefix:类型选择文本,设置默认值为""
  3. 输入函数公式:
With(
    {objKeys: Keys(obj)},
    ForAll(
        objKeys,
        With(
            {
                currentKey: ThisRecord.Value,
                currentValue: obj[ThisRecord.Value]
            },
            If(
                IsType(currentValue, Record),
                // 递归处理嵌套对象
                FlattenJSON(currentValue, If(IsBlank(prefix), currentKey, prefix & "." & currentKey)),
                If(
                    IsType(currentValue, Table),
                    // 将数组转为逗号分隔的文本
                    {
                        Key: If(IsBlank(prefix), currentKey, prefix & "." & currentKey),
                        Value: Concat(currentValue, Text(Value), ", ")
                    },
                    // 普通值转为文本,自动处理null
                    {
                        Key: If(IsBlank(prefix), currentKey, prefix & "." & currentKey),
                        Value: Text(currentValue)
                    }
                )
            )
        )
    )
)

3. 生成扁平化集合

将数据数组中的每个对象都扁平化,存入集合:

ClearCollect(
    colFlattenedData,
    ForAll(
        varDataArray,
        {
            ItemIndex: CountRows(colFlattenedData) + 1,
            KeyValuePairs: FlattenJSON(ThisRecord.Value)
        }
    )
)

4. 在画廊中动态展示

使用嵌套画廊实现灵活展示:

  • 外层画廊:数据源选择colFlattenedData,添加标签控件显示"条目 " & ThisItem.ItemIndex
  • 内层画廊:数据源选择ThisItem.KeyValuePairs,添加两个标签控件:
    • 第一个标签:ThisItem.Key(显示字段名)
    • 第二个标签:ThisItem.Value(显示对应值)

关键问题解决

  • 动态属性访问错误:使用obj[Key]而非点语法访问动态属性,避免"Name isn't valid"错误
  • 文本转换错误:用Text(currentValue)统一转换所有值,自动处理null、数字等非文本类型,解决"Text function has invalid arguments"错误
  • 嵌套结构处理:通过自定义递归函数遍历所有嵌套对象,无需硬编码字段路径

内容的提问来源于stack exchange,提问作者Jerry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 21:54:55