【问题标题】:Unable to parse JSON list in Azure Data Factory ADF无法解析 Azure 数据工厂 ADF 中的 JSON 列表
【发布时间】:2019-07-19 21:08:49
【问题描述】:

在我的数据工厂管道中,我有一个 Web 活动,它给出了 JSON 响应。在下一个存储过程活动中,我无法解析输出参数。我尝试了几种方法。

我在网络活动中设置了 Content-Type application/json

示例 JSON:

Output
{
    "Response": "[{\"Message\":\"Number of barcode(s) found:1\",\"Status\":\"Success\",\"CCS Office\":[{\"Name\":\"Woodstock\",\"CCS Description\":null,\"BranchType\":\"Sub CFS Office\",\"Status\":\"Active\",\"Circle\":\"NJ\"}]}]"
}

对于存储过程活动中的参数:

@json(first(activity('Web1').output.Response))

输出 - System.Collections.Generic.List`1[System.Object]

@json(activity('Web1').output.Response[0])

输出 - 无法评估,因为无法选择属性“0”。 'String' 类型的值不支持属性选择

@json(activity('Web1').output.Response.Message)

输出 - 无法评估,因为无法选择属性“消息”。 'String' 类型的值不支持属性选择

【问题讨论】:

  • 你好。你试过.output.value[0].Message.output.value[0].Response.Message.output.value[0].Response吗?我们正在使用这种格式,它可以在我们的管道中使用。
  • @Praetorian1995 我累了,但没用。错误 - 无法评估 activity('Web1').output.value[0].Message',因为属性 'value' 不存在,可用属性是 'Response' 'activity('Web1').output.value[0 ].Response.Message' 无法评估,因为属性“值”不存在,可用属性为“响应”

标签: json azure-data-factory


【解决方案1】:

这是我所做的: 我创建了一个新管道,并完全使用您的“输出”创建了一个“对象”类型的参数:

{     "Response": "[{\"Message\":\"Number of barcode(s) found:1\",\"Status\":\"Success\",\"CCS Office\":[{\"Name\":\"Woodstock\",\"CCS Description\":null,\"BranchType\":\"Sub CFS Office\",\"Status\":\"Active\",\"Circle\":\"NJ\"}]}]" }

我创建了一个变量和 setVariable 活动。变量是字符串类型。我使用的动态表达式是:

@{json(pipeline().parameters.output.response)[0]}

让我分解并解释一下。 {花括号} 是必要的,因为变量是字符串类型。你可能不想要/不需要它们。

json(....)

是必要的,因为 'response' 值的数据类型保留为字符串。它是否是字符串是正确的行为是一个不同的讨论。通过从字符串转换为 json,我现在可以做最后一块了。

[0]

现在可以工作,因为数据工厂将内容视为对象而不是字符串文字。这种转换似乎也适用于嵌套内容,因为如果没有封装 {花括号} 来转换为字符串,我的 setVariable 活动会出现类型错误,因为变量是字符串类型。

整个管道代码:

{
"name": "pipeline11",
"properties": {
    "activities": [
        {
            "name": "Set Variable1",
            "type": "SetVariable",
            "dependsOn": [],
            "userProperties": [],
            "typeProperties": {
                "variableName": "thing",
                "value": {
                    "value": "@{json(pipeline().parameters.output.response)[0]}",
                    "type": "Expression"
                }
            }
        }
    ],
    "parameters": {
        "output": {
            "type": "object",
            "defaultValue": {
                "Response": "[{\"Message\":\"Number of barcode(s) found:1\",\"Status\":\"Success\",\"CCS Office\":[{\"Name\":\"Woodstock\",\"CCS Description\":null,\"BranchType\":\"Sub CFS Office\",\"Status\":\"Active\",\"Circle\":\"NJ\"}]}]"
            }
        }
    },
    "variables": {
        "thing": {
            "type": "String"
        }
    },
    "annotations": []
}

}

【讨论】:

  • 感谢您的详细解释。真的很有帮助。
  • 感谢您的反馈:)
【解决方案2】:

我遇到了类似的问题,这就是我解决问题的方法。

我将 Response 的值作为字符串传递给调用 Azure SQL 中的存储过程的查找活动。存储过程使用 Json_value 解析字符串并将单个键值作为一行返回。现在可以直接从前面的活动中访问查找活动的输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-06
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2020-05-24
    相关资源
    最近更新 更多