动态解析 JSON 为对象或数组
Source: Dev.to
概述
本指南说明在 Azure Logic Apps 中处理数据时,如何动态解析可能同时包含对象或数组的 contacts 字段的 JSON。
场景
客户需要将 WorkflowMax 中的客户列表导入 SQL。每条客户记录包含基本信息和联系人列表。WorkflowMax 提供 XML 数据,随后转换为 JSON 并存储在 Azure Blob Storage 中。
挑战在于:contacts 字段有时是数组(当客户有多个联系人时),有时是单个对象(当只有一个联系人时)。这种不一致导致在 Logic App 中处理 JSON 时出现困难。
示例 JSON
多个联系人(数组)
{
"_id": "64fafdab0148d179b4bad3d6",
"index": 0,
"guid": "a5a30726-560b-4548-9219-d3e579ff4df0",
"name": "Joanna Stephenson",
"company": "SYNKGEN",
"contacts": [
{
"id": 0,
"name": "Church Cleveland",
"email": "churchclevelan@synkgen.com",
"age": 37
},
{
"id": 1,
"name": "Tabitha Gentry",
"email": "tabithagentry@synkgen.com",
"age": 26
}
]
}
单个联系人(对象)
{
"_id": "64fafdabea7f6eecf0e80b44",
"index": 1,
"guid": "3f273e26-2dec-4a56-a139-760977630590",
"name": "Lynnette Guerra",
"company": "COMTOURS",
"contacts": {
"id": 1,
"name": "Marcie Spence",
"email": "marciespence@comtours.com",
"age": 40
}
}
问题
Azure Data Factory 的复制活动会将 contacts 字段输出为:
- 当有多个联系人时为 数组,或
- 当只有一个联系人时为 对象。
Logic Apps 无法直接处理同一属性在对象和数组之间切换的模式。
参考解决方案
Power Users 论坛上讨论了类似问题:
Dynamically Parse JSON as object or Array
该方案的核心是运行时检查 contacts 元素的 type 或 length,并在后续处理前将其标准化为数组。
在 Logic Apps 中的实现步骤
-
触发器 – 当 Blob Storage 中创建新的 JSON 文件时。
-
解析 JSON – 使用 Parse JSON 操作,并提供将 contacts 定义为对象数组的模式。
-
初始化变量 – 创建一个数组变量,例如
normalizedContacts。 -
条件 – 添加 Condition 操作,测试
@length(body('Parse_JSON')?['contacts'])是否返回大于 0 的数字。-
如果为真(contacts 已经是数组):
@setVariable('normalizedContacts', body('Parse_JSON')?['contacts']) -
如果为假(contacts 是单个对象):
@setVariable('normalizedContacts', createArray(body('Parse_JSON')?['contacts']))
-
-
For Each – 循环遍历
variables('normalizedContacts'),对每个联系人进行处理(例如 upsert 到 SQL)。 -
插入/Upsert 客户 – 使用相应的连接器将顶层客户详情写入数据库。
关键表达式细节
-
检查 contacts 是否为数组
@greater(length(body('Parse_JSON')?['contacts']), 0) -
将单个对象转换为数组
createArray(body('Parse_JSON')?['contacts'])
结果
通过将 contacts 字段统一规范化为数组(无论原始结构如何),Logic App 能够可靠地遍历每个联系人并执行所需的数据库操作。