

经过仔细考虑，我们决定停用适用于 SQL 应用程序的 Amazon Kinesis Data Analytics：

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

2. 从 **2025 年 10 月 15 日**起，您将无法为 SQL 应用程序创建新的 Kinesis Data Analytics。

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

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

# 与 JSONPath
<a name="about-json-path"></a>

**注意**  
2023 年 9 月 12 日之后，如果您尚未使用 Kinesis Data Analytics for SQL，则将无法使用 Kinesis Data Firehose 作为来源创建新应用程序。有关更多信息，请参阅[限制](https://docs.amazonaws.cn//kinesisanalytics/latest/dev/limits.html)。

JSONPath 是一种查询 JSON 对象元素的标准化方法。 JSONPath 使用路径表达式在 JSON 文档中浏览元素、嵌套元素和数组。有关 JSON 的更多信息，请参阅 [JSON 简介](http://www.json.org/)。

Amazon Kinesis Data Analytics JSONPath 使用应用程序源架构中的表达式来识别包含 JSON 格式数据的流源中的数据元素。

有关如何将流式数据映射到应用程序输入流的更多信息，请参阅[将流式传输源元素映射到 SQL 输入列](sch-mapping.md)。

## 使用以下方式访问 JSON 元素 JSONPath
<a name="about-json-path-elements"></a>

接下来，你可以找到如何使用 JSONPath 表达式来访问 JSON 格式数据中的各种元素。对于此部分中的示例，请假设源流包含以下 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 元素
<a name="about-json-path-firstlevel"></a>

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

```
$.elementName
```

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

```
$.customerName
```

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

```
John Doe
```

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

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

```
$.customerId
```

### 访问嵌套 JSON 元素
<a name="about-json-path-nested"></a>

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

```
$.parentElement.element
```

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

```
$.address.city
```

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

```
Anytown
```

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

```
$.parentElement.element.subElement
```

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

```
$.address.streetAddress.street
```

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

```
AnyStreet
```

### 访问数组
<a name="about-json-path-arrays"></a>

您可以通过以下方式访问 JSON 数组中的数据：
+ 将数组中的所有元素作为单一的行进行检索。
+ 将数组中的每个元素作为单独的行进行检索。

#### 以单个行检索数组中的所有元素
<a name="about-json-path-arrays-row"></a>

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

```
$.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"}]
```

#### 以单独的行分别检索数组中的所有元素
<a name="about-json-path-arrays-separate"></a>

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

```
$.arrayObject[0:].element
```

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

```
$.orders[0:].orderId
```

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


****  

|  | 
| --- |
|  23284  | 
|  63122  | 
|  77284  | 

**注意**  
如果查询非数组元素的表达式包含在查询各个数组元素的架构中，则非数组元素将针对数组中的每个元素重复。例如，假设前面的 JSON 示例的架构包含以下表达式：  
\$1.customerName
\$1.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
  ```

## 其他考虑因素
<a name="about-json-path-other"></a>

使用时需要考虑的其他注意事项 JSONPath 如下：
+ 如果应用程序架构中 JSONPath表达式中的单个元素未访问任何数组，则会在应用程序的输入流中为处理的每个 JSON 记录创建一行。
+ 当数组被平展后（即，它的元素以单独的行返回），任何缺失的元素都会导致在应用程序内部流中创建一个 null 值。
+ 一个数组将始终被平展为至少一行。如果不会返回任何值 (即，数组为空或没有查询数组的任何元素)，则会返回包含所有 null 值的单个行。

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

  ```
  $.orders[0:].itemId
  ```

  前面的表达式将从前面的 JSON 示例记录返回以下内容。  
****    
[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/kinesisanalytics/latest/dev/about-json-path.html)

## 相关主题
<a name="about-json-path.Related"></a>
+ [介绍 JSON](http://www.json.org/)