我正在开发一个 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 响应格式的更改。
您尝试了什么以及您期待什么?
尝试在 Power Apps 中进行扁平化:
ParseJSON
、Table
和 ForAll
等函数来动态提取 JSON 的属性。但是,Power Apps 缺乏对迭代对象属性或动态处理嵌套 JSON 中的数组的本机支持。尝试过键值对映射:
ForAll
循环从 JSON 中提取键值对,但在处理 Name isn't valid
和 Text function has invalid arguments
等动态字段时遇到了 PropertyName
或 PropertyValue
等错误。预期结果:
我想创建一个解决方案,其中 Power Apps 可以动态处理 JSON 数据(包括嵌套对象和数组),无论其结构如何,并将其显示在图库或集合中,而无需每次 API 更改时进行手动调整。
API 由 Power Automate 处理;
如果您使用标准 HTTP 响应块,则无法使用此块进行动态 API 响应,因为它需要响应架构。最好的办法是为每种响应格式设计多个块,并将正确的块返回给 PowerApps。
但是,如果您在 Power Automate 内处理 API 响应并对其进行操作,则将内容返回到 PowerApps,如下图所示。对于返回到 PowerApps 的内容,您有更大的灵活性,如果您使用 HTTP 块调用端点,那么您仍然需要有一个处理响应的架构。
在 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),
}
)
)