

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# JSON 拡張
<a name="iot-sql-json"></a>

入れ子になった JSON オブジェクトに対応するには、次に示す ANSI SQL 構文への拡張を使用できます。

"." 演算子

この演算子は、埋め込み 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 形式でない場合、`*` はメッセージペイロード全体を raw バイトとして返します。以下に例を示します。

```
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"
}
```