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 的帮助!我太专注于仅使用解析步骤来解决它,而没有考虑其他解决问题的方法..
我需要从 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 的帮助!我太专注于仅使用解析步骤来解决它,而没有考虑其他解决问题的方法..