使用过滤器 activity 传递参数以复制 activity

Passing parameters to copy activity using filter activity

我通过获取元数据 activity 获得了文件夹中的文件列表,然后在过滤器 activity 的帮助下对文件进行了整理。现在我想通过这些文件的名称来复制activity。

这是过滤器 activity 的输出(只有一个文件,因为它在每个 activity 内):

{
    "ItemsCount": 2,
    "FilteredItemsCount": 1,
    "Value": [
        {
            "name": "part-00000-622d6021-26bc-4ad5-9e4c-0d80cec7c6b7-c000.csv",
            "type": "File"
        }
    ]
}

如何传递名称以在源端复制 activity?

比如我已经试过了:@activity('Filter1_copy1').output.value - @activity('Filter1_copy1' ).output.value[0]

我尝试过的一切都会导致错误:

ErrorCode=UserErrorInvalidValueInPayload,'Type=Microsoft.DataTransfer.Common.Shared.HybridDelivery
Exception,Message=Failed to convert the value in 'fileName' property to 'System.String' type. 
Please make sure the payload structure and value are correct.,Source=Microsoft.DataTransfer.DataContracts,
''Type=System.InvalidCastException,Message=Object must implement IConvertible.,Source=mscorlib,'

Azure 数据工厂 (ADF) 表达式语言并不是世界上最直观的东西,但有一个强大的核心元素,它实际上只是 JSONPath(的子集),如 XPath,询问复杂 JSON 对象的简单语言。这使用点语法来访问属性(例如 parent.child)和数组语法来访问数组 Value[0].name.

Filteractivity(如获取元数据activity)returnsJSON的复杂片段[=36] =],表示为一个对象。

在您的特定示例中,您有一个带有 Value 数组的对象,该数组可以包含零个或多个项目。请记住数组在 JSONPath 中是从零开始的。因此,为了访问此数组的第一个值,我们需要使用称为序数 ([0]) 的从零开始的位置指示符,以及获取属性的点语法,例如 name

@activity('Filter1').output.Value[0].name

记住大小写在 JSON 和 JSONPath 中很重要,因此数组是 Value(大写 V)。根据需要修改 ADF activity 名称(例如 Filter1_copy 而不是我示例中的 Filter1,但我鼓励您查看命名约定:)

只是为了好玩,我使用 jsonpath.com 来练习这些表达式,而不必每次都 运行 并重新 运行 管道以查看它是否有效。它可以让你在正确的地方。经过一些练习后,您将能够查看 activity 输出并计算出表达式应该是什么。一个简单的例子:

我认为 ADF 不支持完整的 JSONPath 语法,但我只是粘贴了您的示例 JSON,并写入了 Values[0].name 位进行测试。