Azure 数据流:从 JSON 字符串中解析对象的嵌套列表

Azure Data Flow: Parse nested list of objects from JSON String

我需要从 Azure 数据流中的字符串解析 JSON 数据。到目前为止,我能够使用数据流的“解析”功能解析所有数据。但是现在我面对一个对象列表,我不知道如何解析那个“复杂数组”的值。

我的数据是这样的:
有一些元数据字段(此处为空)和 Base64 编码的 Body 字段。每个 JSON 文档都在一个单独的 JSON 文件中。

示例数据:

{
    "metadata": null,
    "Body": "eyJpZCI6ICIxIiwgImNvdW50IjogMTIsICJwcm9qZWN0cyI6IFt7Imd1aWQiOiAiMTIzMTItMTI0MzE0LTEyNDEtMTIzNCIsICJzdGF0dXMiOiAic3RvcHBlZCJ9LHsiZ3VpZCI6ICJjc2lzdi1uZDkyM24tMTM0MS0yMzQxIiwgInN0YXR1cyI6ICJydW5uaW5nIn1dfQ"
}

为澄清起见,编码后的示例数据如下所示:

{
    "metadata": null,
    "Body": "{"id": "1", "count": 12, "projects": [{"guid": "12312-124314-1241-1234", "status": "stopped"},{"guid": "csisv-nd923n-1341-2341", "status": "running"}]}"
}

我的目标是拥有一个包含 Body 数据的镶木地板文件。 所以应该有三列:id、count、projects。项目应包含复杂对象的列表。

最终结果应该是这样的:

这是结果,当我加载一个 JSON 文件时,其中 Body 数据未编码,而是包含对象列表的纯 JSON。请注意,这对于原始问题是不可行的,其中 JSON 数据是 Base64 编码的。

当我将示例数据加载到数据流中时,投影看起来像这样(如预期的那样):

首先,我需要解码 Base64 Body,然后我可以解析 JSON 字符串:

解码主体在这里完成:

这里完成了基本的解析:

如何解析“projects”字段?鉴于数组字段列表中的每个对象都具有相同的架构。

我已经尝试将字段“projects”解析为字符串并添加另一个解析步骤将此字符串解析为“Array of documents”,但结果仅为 Null 值..

最终的数据流如下所示:

解析必须分成几个部分。

  • 首先需要将数组解析为字符串数组
  • 字符串数组必须展开
  • 现在,每个数组条目都可以被解析
  • 分解的数组可以收集回来得到我想要的结构
  • 最后,分解和重新收集的数据可以重新加入到原始数据中

将对象数组解析为字符串数组

记住:我要解析的数据是这样的:

{
    "metadata": null,
    "Body": "{"id": "1", "count": 12, "projects": [{"guid": "12312-124314-1241-1234", "status": "stopped"},{"guid": "csisv-nd923n-1341-2341", "status": "running"}]}"
}

所以首先我需要解析“Body”列,这是 BodyDecoded,因为我首先必须从 Base64 解码。对象数组必须解析为字符串数组。 因此,解析步骤的“输出列类型”如下所示:

(id as string,
count as integer,
projects as string[])

值写入 BodyContent 列。为了使接下来的步骤更容易,首先将层次结构展平。可以为此使用列模式,但我会在这里明确地这样做:

此外,项目列现已重命名为 projectsStringArray

分解字符串数组

现在 projectsStringArray 可以使用“展平”步骤展开。

这里也取了id列,方便以后回忆数组。

结果如下所示:

解析 JSON 个字符串

现在每个字符串都可以像往常一样通过“解析”步骤进行解析

(guid as string,
 status as string)

收集已解析的对象

可以使用“收集”功能将已解析的对象再次聚合到列表中。

重新加入原始数据

要获得所需的结构,必须将收集的列连接到原始数据。 id 列可用于连接数据。

结果

在最终 select 之后,结构看起来符合要求:

备注: 感谢 Microsoft 的 Erik 的帮助!我太专注于仅使用解析步骤来解决它,而没有考虑其他解决问题的方法..