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

Posted

技术标签:

【中文标题】Azure 数据流:从 JSON 字符串解析对象的嵌套列表【英文标题】:Azure Data Flow: Parse nested list of objects from JSON String 【发布时间】:2021-10-03 09:41:33 【问题描述】:

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

我的数据如下所示: 有一些元数据字段(此处为空)和 Base64 编码的正文字段。每个 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 数据的 parquet 文件。 所以应该有三列:id、count、projects。项目应包含复杂对象的列表。

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

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

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

解码体在这里完成:

基本解析在这里完成:

如何解析“项目”字段?假设数组字段列表中的每个对象都具有相同的架构。

我已经尝试将字段“projects”解析为字符串,并添加另一个 Parse 步骤以将此字符串解析为“文档数组”,但结果只是 Null 值..

【问题讨论】:

【参考方案1】:

最终的数据流如下所示:

解析必须分成几个部分。

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

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

记住:我要解析的数据如下所示:


    "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 列。为了使接下来的步骤更容易,首先将层次结构扁平化。可以为此使用列模式,但我会在这里明确地这样做:

此外,projects 列现在重命名为projectsStringArray

分解字符串数组

现在projectsStringArray 可以使用“展平”步骤进行分解。

id 列也取到这里,以便以后能够重新收集数组。

结果如下所示:

解析 JSON 字符串

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

(guid as string,
 status as string)

收集解析的对象

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

重新加入原始数据

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

结果

最终选择后,结构看起来符合要求:

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

【讨论】:

以上是关于Azure 数据流:从 JSON 字符串解析对象的嵌套列表的主要内容,如果未能解决你的问题,请参考以下文章

Azure 逻辑应用 - 解析 JSON 架构失败“对象中缺少必需的属性”

Azure API 管理订阅数据解析 json 失败

使用 azure 数据工厂管道将 json 对象存储到 azure 表存储实体

如何从 Azure SQL 数据库中的 Blob 解析 Json

如何从 Azure 数据工厂中的 json 对象中提取值

js中解析json对象:JSON.parse()用于从一个字符串中解析出json对象, JSON.stringify()用于从一个对象解析出字符串。