动态解析 JSON 为对象或数组

发布: (2025年12月29日 GMT+8 08:15)
3 min read
原文: Dev.to

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 元素的 typelength,并在后续处理前将其标准化为数组。

在 Logic Apps 中的实现步骤

  1. 触发器 – 当 Blob Storage 中创建新的 JSON 文件时。

  2. 解析 JSON – 使用 Parse JSON 操作,并提供将 contacts 定义为对象数组的模式。

  3. 初始化变量 – 创建一个数组变量,例如 normalizedContacts

  4. 条件 – 添加 Condition 操作,测试 @length(body('Parse_JSON')?['contacts']) 是否返回大于 0 的数字。

    • 如果为真(contacts 已经是数组):

      @setVariable('normalizedContacts', body('Parse_JSON')?['contacts'])
    • 如果为假(contacts 是单个对象):

      @setVariable('normalizedContacts', createArray(body('Parse_JSON')?['contacts']))
  5. For Each – 循环遍历 variables('normalizedContacts'),对每个联系人进行处理(例如 upsert 到 SQL)。

  6. 插入/Upsert 客户 – 使用相应的连接器将顶层客户详情写入数据库。

关键表达式细节

  • 检查 contacts 是否为数组

    @greater(length(body('Parse_JSON')?['contacts']), 0)
  • 将单个对象转换为数组

    createArray(body('Parse_JSON')?['contacts'])

结果

通过将 contacts 字段统一规范化为数组(无论原始结构如何),Logic App 能够可靠地遍历每个联系人并执行所需的数据库操作。

Back to Blog

相关文章

阅读更多 »