mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-10-02 14:40:50 +00:00
52 lines
3.4 KiB
ReStructuredText
52 lines
3.4 KiB
ReStructuredText
|
Функции для работы с JSON.
|
|||
|
-------------------
|
|||
|
В Яндекс.Метрике пользователями передаётся JSON в качестве параметров визитов. Для работы с таким JSON-ом, реализованы некоторые функции. (Хотя в большинстве случаев, JSON-ы дополнительно обрабатываются заранее, и полученные значения кладутся в отдельные столбцы в уже обработанном виде.) Все эти функции исходят из сильных допущений о том, каким может быть JSON, и при этом стараются почти ничего не делать.
|
|||
|
|
|||
|
Делаются следующие допущения:
|
|||
|
#. Имя поля (аргумент функции) должно быть константой;
|
|||
|
#. Считается, что имя поля в JSON-е закодировано некоторым каноническим образом. Например, ``visitParamHas('{"abc":"def"}', 'abc') = 1``, но ``visitParamHas('{"\\u0061\\u0062\\u0063":"def"}', 'abc') = 0``
|
|||
|
#. Поля ищутся на любом уровне вложенности, без разбора. Если есть несколько подходящих полей - берётся первое.
|
|||
|
#. В JSON-е нет пробельных символов вне строковых литералов.
|
|||
|
|
|||
|
visitParamHas(params, name)
|
|||
|
~~~~~~~
|
|||
|
Проверить наличие поля с именем name.
|
|||
|
|
|||
|
visitParamExtractUInt(params, name)
|
|||
|
~~~~~~~~~
|
|||
|
Распарсить UInt64 из значения поля с именем name. Если поле строковое - попытаться распарсить число из начала строки. Если такого поля нет, или если оно есть, но содержит не число, то вернуть 0.
|
|||
|
|
|||
|
visitParamExtractInt(params, name)
|
|||
|
~~~~~~~
|
|||
|
Аналогично для Int64.
|
|||
|
|
|||
|
visitParamExtractFloat(params, name)
|
|||
|
~~~~~~~
|
|||
|
Аналогично для Float64.
|
|||
|
|
|||
|
visitParamExtractBool(params, name)
|
|||
|
~~~~~~~~
|
|||
|
Распарсить значение true/false. Результат - UInt8.
|
|||
|
|
|||
|
visitParamExtractRaw(params, name)
|
|||
|
~~~~~~~
|
|||
|
Вернуть значение поля, включая разделители.
|
|||
|
|
|||
|
Примеры:
|
|||
|
::
|
|||
|
visitParamExtractRaw('{"abc":"\\n\\u0000"}', 'abc') = '"\\n\\u0000"'
|
|||
|
visitParamExtractRaw('{"abc":{"def":[1,2,3]}}', 'abc') = '{"def":[1,2,3]}'
|
|||
|
|
|||
|
visitParamExtractString(params, name)
|
|||
|
~~~~~~~~~~~
|
|||
|
Распарсить строку в двойных кавычках. У значения убирается экранирование. Если убрать экранированные символы не удалось, то возвращается пустая строка.
|
|||
|
|
|||
|
Примеры:
|
|||
|
::
|
|||
|
visitParamExtractString('{"abc":"\\n\\u0000"}', 'abc') = '\n\0'
|
|||
|
visitParamExtractString('{"abc":"\\u263a"}', 'abc') = '☺'
|
|||
|
visitParamExtractString('{"abc":"\\u263"}', 'abc') = ''
|
|||
|
visitParamExtractString('{"abc":"hello}', 'abc') = ''
|
|||
|
|
|||
|
На данный момент, не поддерживаются записанные в формате ``\uXXXX\uYYYY`` кодовые точки не из basic multilingual plane (они переводятся не в UTF-8, а в CESU-8).
|