天天看点

对集合进行JSON文本化处理的注意事项

我是微软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
        )
    }
);
      
[
    {
        "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"
    }
]