我是微软Dynamics 365 & Power Platform方面的工程师/顾问罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面的微软最有价值专家(Microsoft MVP),这是我的第487篇原创文章,写于2022年10月24日。

JSON函数的介绍请参考官方文档:​​JSON function in Power Apps​​​ ,接着​​前一篇博文​​,使用Defaults(表的复数展示名) 对集合进行了初始化然后对其中记录进行了更新,或者直接Filter或者Lookup进行了集合的初始化,我们如果要展示这集合的JSON文本形式呢?如果直接使用JSON函数的话会报错的,报错信息一般是:The JSON function cannot serialize tables / objects with a nested property called '_ly_customer_value' of type 'Polymorphic'.。

这时候我们使用参数 JSONFormat.IgnoreUnsupportedTypes 即可解决。但是这个带来的问题是,有些我需要的复杂类型的字段,比如查找字段进行JSON文本化后不见了,如何拿到这个ID值并且也JSON文本化呢?我们可以使用 AddColumns 函数,函数的官方文档请参考 ​​AddColumns, DropColumns, RenameColumns, and ShowColumns functions in Power Apps​​ 。但是这个添加列不是在原有Collection上增加一个列,而是函数返回的Collection上会增加这个列,另外值得注意的是增加的列的名称要用双引号引用起来,所以我这里更改下代码如下,比如我针对 ly_submittedby 字段增加一个列 ly_submittedby_id,然后JSON文本化。一般的,为了控制JSON文本化后的大小,我们一般还会使用ShowColumns来制定列,下面是一个示例:

orAll(
galTestEntities.AllItems,
If(
IsBlank(lblKey.Text),
Patch(
colTestEntities,
LookUp(
colTestEntities,
IsBlank('Test Entity') && IsBlank(ly_name)
),
{
ly_name: txtName.Text,
ly_choice: cmbChoice.Selected.Value,
ly_money: Value(txtMoney.Text),
最近审批提交人: cmbSubmittedBy.Selected
}
),
Patch(
colTestEntities,
LookUp(
colTestEntities,
'Test Entity' = GUID(lblKey.Text)
),
{
ly_name: txtName.Text,
ly_choice: cmbChoice.Selected.Value,
ly_money: Value(txtMoney.Text),
最近审批提交人: cmbSubmittedBy.Selected
}
)
)
);
RemoveIf(
colTestEntities,
IsBlank('Test Entity') && IsBlank(ly_name)
);
ClearCollect(
colTestEntitiesforJson,
ShowColumns(
AddColumns(
colTestEntities,
"ly_submittedby_id",
If(
IsBlank(ThisRecord.最近审批提交人),
Blank(),
Text(ThisRecord.最近审批提交人.User)
)
),
"ly_testentityid",
"ly_submittedby_id",
"ly_name",
"ly_choice",
"ly_money"
)
);
UpdateContext(
{
jsonStr: JSON(
colTestEntitiesforJson,
JSONFormat.IgnoreUnsupportedTypes
)
}
);


转换后的JSON文本示例如下:

[
{
"ly_choice":124450000,
"ly_money":23455,
"ly_name":"1",
"ly_submittedby_id":"c422779e-3d0b-ed11-b83d-000d3a80d41c",
"ly_testentityid":"3e6e30a4-652a-ed11-9db2-000d3a80d9b8"
},
{
"ly_choice":124450001,
"ly_money":11,
"ly_name":"11",
"ly_submittedby_id":null
},
{
"ly_choice":124450002,
"ly_money":111,
"ly_name":"111",
"ly_submittedby_id":"cd0b137d-3b0b-ed11-b83d-000d3a80d41c"
}
]