View a markdown version of this page

使用 JSONPath - 适用于 Amazon Kinesis Data Analytics·for·SQL 应用程序开发人员指南
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

经过仔细考虑,我们决定停用适用于 SQL 应用程序的亚马逊 Kinesis 数据分析:

1. 从 2025 年 9 月 1 日起,我们将不再为适用于 SQL 应用程序的 Amazon Kinesis 数据分析提供任何错误修复,因为鉴于即将停产,我们对它的支持将有限。

2. 从 2025 年 10 月 15 日起,您将无法为 SQL 应用程序创建新的 Kinesis 数据分析。

3. 从 2026 年 1 月 27 日起,我们将删除您的应用程序。您将无法启动或操作 Amazon Kinesis Data Analytics for SQL 应用程序。从那时起,将不再提供对 Amazon Kinesis Data Analytics for SQL 的支持。有关更多信息,请参阅 Amazon Kinesis Data Analytics for SQL 应用程序停用

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 JSONPath

注意

2023 年 9 月 12 日之后,如果您尚未使用 Kinesis Data Analytics for SQL,则将无法使用 Kinesis Data Firehose 作为来源创建新应用程序。有关更多信息,请参阅限制

JSONPath 是查询 JSON 对象的元素的标准化方式。JSONPath 使用表达式在 JSON 文档中的元素、嵌套元素和数组之间导航。有关 JSON 的更多信息,请参阅 JSON 简介

亚马逊 Kinesis 数据分析在应用程序的源架构中使用 JsonPath 表达式来识别包含数据的流源中的数据元素。 JSON-format

有关如何将流式数据映射到应用程序输入流的更多信息,请参阅将流式传输源元素映射到 SQL 输入列

使用 JSONPath 访问 JSON 元素

下面,你可以找到如何使用 JsonPath 表达式来访问数据中的 JSON-formatted 各种元素。对于此部分中的示例,请假设源流包含以下 JSON 记录:

{ "customerName":"John Doe", "address": { "streetAddress": [ "number":"123", "street":"AnyStreet" ], "city":"Anytown" } "orders": [ { "orderId":"23284", "itemName":"Widget", "itemPrice":"33.99" }, { "orderId":"63122", "itemName":"Gadget", "itemPrice":"22.50" }, { "orderId":"77284", "itemName":"Sprocket", "itemPrice":"12.00" } ] }

访问 JSON 元素

要使用 JSONPath 查询 JSON 数据中的元素,请使用以下语法。在此处,$ 表示数据层次结构的根,elementName 是要查询的元素节点的名称。

$.elementName

以下表达式将查询前面的 JSON 示例中的 customerName 元素。

$.customerName

前面的表达式将从前面的 JSON 记录返回以下内容。

John Doe
注意

路径表达式区分大小写。表达式 $.customername 将从前面的 JSON 示例返回 null

注意

如果路径表达式指定的位置没有出现任何元素,则表达式返回 null。以下表达式将从前面的 JSON 示例返回 null,因为没有匹配元素。

$.customerId

访问嵌套 JSON 元素

要查询嵌套 JSON 元素,请使用以下语法。

$.parentElement.element

以下表达式将查询前面的 JSON 示例中的 city 元素。

$.address.city

前面的表达式将从前面的 JSON 记录返回以下内容。

Anytown

您可以使用以下语句进一步查询子元素。

$.parentElement.element.subElement

以下表达式将查询前面的 JSON 示例中的 street 元素。

$.address.streetAddress.street

前面的表达式将从前面的 JSON 记录返回以下内容。

AnyStreet

访问数组

您可以通过以下方式访问 JSON 数组中的数据:

  • 将数组中的所有元素作为单一的行进行检索。

  • 将数组中的每个元素作为单独的行进行检索。

以单个行检索数组中的所有元素

要以单个行查询一个数组的全部内容,请使用以下语法。

$.arrayObject[0:]

以下表达式将查询本部分前面所用 JSON 示例中的 orders 元素的全部内容。它将返回单个行的单个列中的数组内容。

$.orders[0:]

上述表达式从本部分所用的示例 JSON 记录返回如下内容。

[{"orderId":"23284","itemName":"Widget","itemPrice":"33.99"},{"orderId":"61322","itemName":"Gadget","itemPrice":"22.50"},{"orderId":"77284","itemName":"Sprocket","itemPrice":"12.00"}]

以单独的行分别检索数组中的所有元素

要以单独的行分别查询一个数组中的各个元素,请使用以下语法。

$.arrayObject[0:].element

以下表达式将查询前面的 JSON 示例中的 orderId 元素,并将每个数组元素作为一个单独的行返回。

$.orders[0:].orderId

前面的表达式将从前面的 JSON 记录返回以下内容,其中每个数据项都将作为一个单独的行返回。

23284

63122

77284

注意

如果查询非数组元素的表达式包含在查询各个数组元素的架构中,则非数组元素将针对数组中的每个元素重复。例如,假设前面的 JSON 示例的架构包含以下表达式:

  • $.customerName

  • $.orders[0:].orderId

在这种情况下,从示例输入流元素返回的数据行将类似于以下内容 (其中的 name 元素将针对每个 orderId 元素重复)。

John Doe

23284

John Doe

63122

John Doe

77284

注意

以下限制适用于 Amazon Kinesis Data Analytics 中的数组表达式:

  • 数组表达式中仅支持一个级别的解除引用。不支持以下表达式格式。

    $.arrayObject[0:].element[0:].subElement
  • 一个架构中仅可平展一个数组。可以引用多个数组——作为一个包含数组中的所有元素的行返回。但是,只有一个数组可以让其每个元素都作为单个行返回。

    包含以下格式的元素的架构有效。此格式会将第二个数组的内容作为单个列返回,该内容针对第一个数组中的每一个元素重复。

    $.arrayObjectOne[0:].element $.arrayObjectTwo[0:]

    包含以下格式的元素的架构无效。

    $.arrayObjectOne[0:].element $.arrayObjectTwo[0:].element

其他考虑因素

使用 JSONPath 的其他注意事项如下所示:

  • 如果应用程序架构中的 JSONPath 表达式中的单个元素没有访问任何数组,则会在应用程序的输入流中为处理的每个 JSON 记录创建一行。

  • 当数组被平展后(即,它的元素以单独的行返回),任何缺失的元素都会导致在应用程序内部流中创建一个 null 值。

  • 一个数组将始终被平展为至少一行。如果不会返回任何值 (即,数组为空或没有查询数组的任何元素),则会返回包含所有 null 值的单个行。

    以下表达式将从前面的 JSON 示例返回包含 null 值的记录,因为在指定的路径没有匹配的元素。

    $.orders[0:].itemId

    前面的表达式将从前面的 JSON 示例记录返回以下内容。

    null

    null

    null

相关主题