

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

# JSON 扩展
<a name="iot-sql-json"></a>

您可以使用 ANSI SQL 语法的以下扩展，以便于使用嵌套 JSON 对象。

“.” 运算符

此运算符访问嵌入式 JSON 对象中的成员和函数与 ANSI SQL 和. JavaScript 例如：

```
SELECT foo.bar AS bar.baz FROM 'topic/subtopic'
```

从以下发送至 `topic/subtopic` 主题的消息有效载荷中选择 `foo` 对象中的 `bar` 属性。

```
{
  "foo": {
    "bar": "RED",
    "bar1": "GREEN",
    "bar2": "BLUE"
  }
}
```

如果 JSON 属性名称包含连字符或数字字符，则“点”符号将不起作用。相反，您必须使用 [get 函数](iot-sql-functions.md#iot-sql-function-get)来提取属性的值。

 在此示例中，以下消息将发送至 `iot/rules` 主题。

```
{
  "mydata": {
    "item2": {
      "0": {
        "my-key": "myValue"
      }
    }
  }
}
```

通常情况下，`my-key` 的值将被标识为在此查询中。

```
SELECT * from iot/rules WHERE mydata.item2.0.my-key= "myValue"
```

但是，由于属性名称 `my-key` 包含连字符，而 `item2` 包含一个数字字符，因此 [get 函数](iot-sql-functions.md#iot-sql-function-get)必须按以下查询所示的方法使用。

```
SELECT * from 'iot/rules' WHERE get(get(get(mydata,"item2"),"0"),"my-key") = "myValue"
```

 `*` 运算符

该运算符与 ANSI SQL 中的 `*` 通配符的运作方式相同。该运算符仅用于 SELECT 子句，并会创建包含消息数据的全新 JSON 对象。如果消息有效载荷不是 JSON 格式，`*` 将以原始字节形式返回整个消息有效载荷。例如：

```
SELECT * FROM 'topic/subtopic'
```

**将函数应用到属性值**  
下面显示了一个可能由设备发布的 JSON 有效载荷示例：

```
{
    "deviceid" : "iot123",
    "temp" : 54.98,
    "humidity" : 32.43,
    "coords" : {
        "latitude" : 47.615694,
        "longitude" : -122.3359976
    }
}
```

下面的示例将函数应用到 JSON 有效载荷中的一个属性值：

```
SELECT temp, md5(deviceid) AS hashed_id FROM topic/#
```

此查询的结果为以下 JSON 对象：

```
{
   "temp": 54.98,
   "hashed_id": "e37f81fb397e595c4aeb5645b8cbbbd1"
}
```