Azure 数据工厂 - forEach - JSON 到数组错误

Azure Data Factory - forEach - JSON to array errors

我的目标是使用 Azure 数据工厂通过 REST API 将数据从一个地方复制到另一个地方。 复制的第一部分是使用嵌套 JSON/array 中的 ForEach activity 到 select 参数。由于 ForEach activity.

中的各种错误消息,我在使用此嵌套 JSON 时遇到了问题

我的JSON是下面的形式:

(
    {
        "key_1": "value_1",
        "key_2": [
            "value_2_1",
            "value_2_2"
        ]
    }
)

首先我在它前面设置了@json转换函数:

@json(
     '{
        "key_1": "value_1",
        "key_2": [
        "value_2_1",
        "value_2_2"
      ]
     }'
)

在这里你可以看到Execute Pipeline对象及其参数:

我将此 JSON 设置为执行管道对象中的参数。我将其类型设置为“数组”。 (郑重声明,即使我尝试将参数类型更改为“String”或“Object”,我仍然收到类似的错误消息。)

ForEach activity 用于 select 嵌套 JSON 中的一个项目,写入参数。

这会立即在执行管道中产生以下错误 activity:

Operation on target... ...failed: The function 'length' expects its parameter to be an array or a string. The provided value is of type 'Object'.

因此,即使我将 JSON 参数类型设置为“Array”,但在调试管道时它会更改为“Object” activity. 查看下面的错误:

接下来,我尝试在 JSON 文本之前使用 ADF @createArray 函数。

@createArray(
    '{
        "key_1": "value_1",
        "key_2": [
        "value_2_1",
        "value_2_2"
      ]
     }'
)

调试时,forEach activity 在第一个 Copy data activity:

中抛出错误
The expression 'concat(item().SELECTING_key_1_FROM_MY_JSON))' cannot be evaluated because property 'key_1' cannot be selected. Property selection is not supported on values of type 'String'.

请帮帮我,我在尝试将 JSON 转换为数组时做错了什么?我应该在代码中更改什么?

到目前为止,我已经尝试更改参数类型并在 JSON 动态内容中使用各种函数,但没有成功。

更新:
如果你想在 Copy Data --> Sink 中更改文件名。 您可以键入动态内容 @concat(pipeline().parameters.Pip_Object.key_1,'.json') 来重命名文件。

如有理解错误请指正


  1. 首先,我们应该使用参数存储Json数组如下。因为 Variables 不支持存储 Json 数组。 变量只支持存储简单数据类型如["1","2","3"...].

  2. Json数组格式应如下:
    [{"key_1": "value_1"},{"key_2": ["value_2_1","value_2_2"]}]

  3. 我在这里创建了一个简单的测试。然后 ForEach Json 数组:

  4. 里面ForEach1activity,传@item()给对象类型参数Pip_Object.

  5. 输入如下:

我们最终使用了两条管道:一条通用管道和一条特定管道。

通用的有JSON作为参数(JSON_PARAMETER),我们将其设置为以下形式的默认值

[{"key_1":"value_1","key_2":["value_2"]},{"key_1":"value_3","key_2":["value_2"]}, ...etc. ...}]

通用管道有一个 forEach 循环,其中提到的 JSON 参数在设置 -> 项目中被调用:

@JSON(pipeline().parameters.JSON_PARAMETER)

在特定的管道中,有一个执行管道activity,其中JSON_PARAMETER在设置->参数中找到。如果使用默认值 JSON_PARAMETER,则该字段留空。如果我们想更改参数,在执行管道之前,我们放置一个设置变量 activity,我们将变量 -> 值更改为:

@concat('
[
    {"key_1":"value_1",
     "key_2":
            ["value_2",
             "value_3"
            ]
     },
     {"key_1":"value_3",

    ...and so on...

    }
]
')

为每个设置使用表达式、函数和系统变量的任意组合在上面添加动态内容 @activity('Get Metadata1').output.childItems