如何在没有预定义架构的 Power Apps 中动态处理嵌套 JSON?

问题描述 投票:0回答:1

我正在开发一个 Power Apps 应用程序,我需要动态处理从 API 返回的数据。 API 响应包含嵌套的 JSON 对象、数组,有时还包含数组内的对象。挑战在于 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": "[email protected]"
    }
  ]
}

我需要在 Power Apps 中动态处理这些数据,而不需要对字段名称进行硬编码,同时仍然适应 API 响应格式的更改。

您尝试了什么以及您期待什么?

  1. 尝试在 Power Apps 中进行扁平化:

    • 我使用了
      ParseJSON
      Table
      ForAll
      等函数来动态提取 JSON 的属性。但是,Power Apps 缺乏对迭代对象属性或动态处理嵌套 JSON 中的数组的本机支持。
  2. 尝试过键值对映射:

    • 我尝试使用嵌套
      ForAll
      循环从 JSON 中提取键值对,但在处理
      Name isn't valid
      Text function has invalid arguments
      等动态字段时遇到了
      PropertyName
      PropertyValue
      等错误。

预期结果:
我想创建一个解决方案,其中 Power Apps 可以动态处理 JSON 数据(包括嵌套对象和数组),无论其结构如何,并将其显示在图库或集合中,而无需每次 API 更改时进行手动调整。

json power-automate powerapps dynamic-data
1个回答
0
投票

API 由 Power Automate 处理;

如果您使用标准 HTTP 响应块,则无法使用此块进行动态 API 响应,因为它需要响应架构。最好的办法是为每种响应格式设计多个块,并将正确的块返回给 PowerApps。

但是,如果您在 Power Automate 内处理 API 响应并对其进行操作,则将内容返回到 PowerApps,如下图所示。对于返回到 PowerApps 的内容,您有更大的灵活性,如果您使用 HTTP 块调用端点,那么您仍然需要有一个处理响应的架构。

JSON 内容返回到 PowerApp

在 PowerApps 内部,您可以处理 JSON 和无类型对象。

{
  "Version" : 1,
  "RootElement" : {
    "Parent" : {
      "Name" : "This is the parent",
      "Child" : {
        "Name" : "This is the child"
      }
    }
  }
}

然后您可以使用点符号来提取字段。

Set( jsonObject, ParseJSON( jsonStringVariable ) );

Set( parentName, Text( jsonObject.RootElement.Parent.Name ) ); // "This is the parent"

Set( childName, Text( jsonObject.RootElement.Parent.Child.Name ) ); // "This is the child"

数组示例

[
  {
    "firstName": "John",
    "lastName": "Doe",
    "age": 30
  },
  {
    "firstName": "Jane",
    "lastName": "Smith",
    "age": 25
  }
]

解析来自 Power Automate 流程的上述响应。

Collect(
    colPersons,
    ForAll(
        Table(ParseJSON(GetPersonItems.Run().result).body),
        {
            firstName: Text(Value.firstName),
            lastName: Text(Value.lastName),
            age: Value(Value.age),
        }
    )
)
© www.soinside.com 2019 - 2024. All rights reserved.