Тип JSON

  • JSON

Описание

Тип JSON используется для хранения данных JSON согласно стандартному синтаксису, описанному в спецификации.

Для хранения таких данных можно использовать и тип VARCHAR, но при использовании типа JSON данные будут проверяться на соответствие вводимых значений формату JSON, поэтому использовать специальный тип JSON в таких случаях удобнее. К тому же для типа JSON доступны специальные функции, позволяющие обращаться напрямую к данным в структуре JSON.

Кавычки внутри текста в формате JSON должны быть двойными. А обрамляющие этот текст кавычки внутри выражения INSERT должны быть одинарными (см. пример ниже).

Примеры

Создадим таблицу js_table и вставим в столбец js_data данные в формате JSON из этого примера:

CREATE TABLE js_table(name VARCHAR, js_data JSON);

INSERT INTO js_table VALUES
('John Smith',
'{
  "first_name": "John",
  "last_name": "Smith",
  "is_alive": true,
  "age": 27,
  "address": {
    "street_address": "21 2nd Street",
    "city": "New York",
    "state": "NY",
    "postal_code": "10021-3100"
  },
  "phone_numbers": [
    {
      "type": "home",
      "number": "212 555-1234"
    },
    {
      "type": "office",
      "number": "646 555-4567"
    }
  ],
  "children": [
    "Catherine",
    "Thomas",
    "Trevor"
  ],
  "spouse": null
}');

Выведем имена полей верхнего уровня из загруженных данных JSON с помощью функции json_keys:

SELECT
    json_keys(js_data) AS json_fields
FROM js_table;
+---------------------------------------------------------------------------+
|                                json_fields                                |
+---------------------------------------------------------------------------+
| {first_name,last_name,is_alive,age,address,phone_numbers,children,spouse} |
+---------------------------------------------------------------------------+

Выведем в отдельные столбцы полное имя из текстового столбца name, а из данных JSON возьмем возраст age и количество детей — длину массива в поле children. Для этого используем фунции json_extract и json_array_length.

SELECT
    name,
    json_extract(js_data, 'age') AS age,
    json_array_length(js_data, 'children') AS children_num
FROM js_table;
+------------+-----+--------------+
|    name    | age | children_num |
+------------+-----+--------------+
| John Smith | 27  | 3            |
+------------+-----+--------------+

Полезные ссылки