本文へスキップ
`Ctrl`+`K`

# 7.16.15. `json_extract`

Added in version 16.0.6.

注釈

これは実験的な機能です。現時点ではまだ安定しきっていません。

## 7.16.15.1. 概要

`json_extract` は、JSONPath式を使ってJSONから値を抽出します。

抽出された値は、JSONでの型を保持します。例えば、JSON中の文字列はテキストとして抽出され、JSON中の整数は整数として抽出されます。そのため、 `json_extract` は文字列に対する全文検索と数値に対する範囲検索の両方に使えます。

`json_extract` は select の filter オプションと組み合わせてよく使われます。例えば、 `json_extract` と between を組み合わせて、JSONに格納された値に対して範囲検索ができます。

注釈

`json_extract` は simdjson と jsoncons ライブラリーを必要とします。これらなしでGroongaをビルドした場合は利用できません。

## 7.16.15.2. 構文

`json_extract`には必須の引数が2つあります。

    json_extract(json, jsonpath)

## 7.16.15.3. 使い方

以下は、使い方を示すためのスキーマ定義とサンプルデータです。 `value` カラムは `JSON` 型で、ネストした配列を格納します。

実行例：

    table_create Data TABLE_NO_KEY
    # [[0,1337566253.89858,0.000355720520019531],true]
    column_create Data value COLUMN_SCALAR JSON
    # [[0,1337566253.89858,0.000355720520019531],true]
    load --table Data
    [
    {"value": "{\"value\": [[1, 10], [100]]}"},
    {"value": "{\"value\": [[2], [20, 200]]}"},
    {"value": "{\"value\": [[-1, -10], [-100]]}"}
    ]
    # [[0,1337566253.89858,0.000355720520019531],3]

以下の例では、 `$.value[*][*]` というJSONPathでネストした配列のすべての要素を抽出し、 `10` から `20` の間の値を持つレコードを選択します。

実行例：

    select Data --filter 'between(json_extract(value, "$.value[*][*]"), 10, 20)'
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     [
    #       [
    #         2
    #       ],
    #       [
    #         [
    #           "_id",
    #           "UInt32"
    #         ],
    #         [
    #           "value",
    #           "JSON"
    #         ]
    #       ],
    #       [
    #         1,
    #         {
    #           "value": [
    #             [
    #               1,
    #               10
    #             ],
    #             [
    #               100
    #             ]
    #           ]
    #         }
    #       ],
    #       [
    #         2,
    #         {
    #           "value": [
    #             [
    #               2
    #             ],
    #             [
    #               20,
    #               200
    #             ]
    #           ]
    #         }
    #       ]
    #     ]
    #   ]
    # ]

値がJSONのネストした配列に格納されていても、抽出された値が `10` から `20` の間にあるレコードが選択されます。

## 7.16.15.4. 引数

必須の引数が2つあります。

### 7.16.15.4.1. 必須引数

#### 7.16.15.4.1.1. `json`

`json` は対象のJSONです。 `JSON` 型カラムの値のようなパース済みのJSON、またはJSON文字列でなければなりません。

このパラメーターがパース済みのJSONでもJSON文字列でもない場合、 `json_extract` はエラーを報告します。

#### 7.16.15.4.1.2. `jsonpath`

`jsonpath` は、抽出する値にマッチするJSONPath式です。

JSONPath式は `$` で始まります。これはJSON値のルートを意味します。例えば、 `$.value[*]` は `value` 配列のすべての要素にマッチし、 `$.value[*][*]` は `value` の下のネストした配列のすべての要素にマッチします。

このパラメーターが有効なJSONPath文字列でない場合、 `json_extract` はエラーを報告します。

## 7.16.15.5. 戻り値

`json_extract` は、JSONPath式にマッチしたすべての値を含むベクターを返します。抽出された値は、JSONでの型を保持します。

## 7.16.15.6. 参考

- between

- ExtractorJSON

- select