

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# JSON Extensions
<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"
}
```