Funciones para trabajar con JSON 

En el Yandex.Metrica, JSON es transmitido por los usuarios como parámetros de sesión. Hay algunas funciones especiales para trabajar con este JSON. (Aunque en la mayoría de los casos, los JSON también se procesan previamente, y los valores resultantes se colocan en columnas separadas en su formato procesado.) Todas estas funciones se basan en sólidas suposiciones sobre lo que puede ser el JSON, pero tratan de hacer lo menos posible para hacer el trabajo.

Se hacen las siguientes suposiciones:

  1. El nombre de campo (argumento de función) debe ser una constante.
  2. El nombre del campo de alguna manera está codificado canónicamente en JSON. Por ejemplo: visitParamHas('{"abc":"def"}', 'abc') = 1, pero visitParamHas('{"\\u0061\\u0062\\u0063":"def"}', 'abc') = 0
  3. Los campos se buscan en cualquier nivel de anidación, indiscriminadamente. Si hay varios campos coincidentes, se utiliza la primera aparición.
  4. El JSON no tiene caracteres de espacio fuera de los literales de cadena.

visitParamHas (params, nombre) 

Comprueba si hay un campo con el ‘name’ nombre.

visitParamExtractUInt (params, nombre) 

Analiza UInt64 a partir del valor del campo denominado ‘name’. Si se trata de un campo de cadena, intenta analizar un número desde el principio de la cadena. Si el campo no existe, o existe pero no contiene un número, devuelve 0.

visitParamExtractInt (params, nombre) 

Lo mismo que para Int64.

visitParamExtractFloat (params, nombre) 

Lo mismo que para Float64.

visitParamExtractBool (params, nombre) 

Analiza un valor verdadero/falso. El resultado es UInt8.

visitParamExtractRaw (params, nombre) 

Devuelve el valor de un campo, incluidos los separadores.

Ejemplos:

visitParamExtractRaw('{"abc":"\\n\\u0000"}', 'abc') = '"\\n\\u0000"'
visitParamExtractRaw('{"abc":{"def":[1,2,3]}}', 'abc') = '{"def":[1,2,3]}'

visitParamExtractString(params, nombre) 

Analiza la cadena entre comillas dobles. El valor es sin escape. Si no se pudo desescapar, devuelve una cadena vacía.

Ejemplos:

visitParamExtractString('{"abc":"\\n\\u0000"}', 'abc') = '\n\0'
visitParamExtractString('{"abc":"\\u263a"}', 'abc') = '☺'
visitParamExtractString('{"abc":"\\u263"}', 'abc') = ''
visitParamExtractString('{"abc":"hello}', 'abc') = ''

Actualmente no hay soporte para puntos de código en el formato \uXXXX\uYYYY que no son del plano multilingüe básico (se convierten a CESU-8 en lugar de UTF-8).

Las siguientes funciones se basan en simdjson diseñado para requisitos de análisis JSON más complejos. La suposición 2 mencionada anteriormente todavía se aplica.

¿Qué puedes encontrar en Neodigit) 

Comprueba que la cadena pasada es un json válido.

Ejemplos:

SELECT isValidJSON('{"a": "hello", "b": [-100, 200.0, 300]}') = 1
SELECT isValidJSON('not a json') = 0

JSONHas(json[, indices_or_keys]…) 

Si el valor existe en el documento JSON, 1 serán devueltos.

Si el valor no existe, 0 serán devueltos.

Ejemplos:

SELECT JSONHas('{"a": "hello", "b": [-100, 200.0, 300]}', 'b') = 1
SELECT JSONHas('{"a": "hello", "b": [-100, 200.0, 300]}', 'b', 4) = 0

indices_or_keys es una lista de cero o más argumentos, cada uno de ellos puede ser de cadena o entero.

  • Cadena = miembro del objeto de acceso por clave.
  • Entero positivo = acceder al n-ésimo miembro / clave desde el principio.
  • Entero negativo = acceder al n-ésimo miembro / clave desde el final.

El índice mínimo del elemento es 1. Por lo tanto, el elemento 0 no existe.

Puede usar enteros para acceder a matrices JSON y objetos JSON.

Entonces, por ejemplo:

SELECT JSONExtractKey('{"a": "hello", "b": [-100, 200.0, 300]}', 1) = 'a'
SELECT JSONExtractKey('{"a": "hello", "b": [-100, 200.0, 300]}', 2) = 'b'
SELECT JSONExtractKey('{"a": "hello", "b": [-100, 200.0, 300]}', -1) = 'b'
SELECT JSONExtractKey('{"a": "hello", "b": [-100, 200.0, 300]}', -2) = 'a'
SELECT JSONExtractString('{"a": "hello", "b": [-100, 200.0, 300]}', 1) = 'hello'

JSONLength(json[, indices_or_keys]…) 

Devuelve la longitud de una matriz JSON o un objeto JSON.

Si el valor no existe o tiene un tipo incorrecto, 0 serán devueltos.

Ejemplos:

SELECT JSONLength('{"a": "hello", "b": [-100, 200.0, 300]}', 'b') = 3
SELECT JSONLength('{"a": "hello", "b": [-100, 200.0, 300]}') = 2

JSONType(json[, indices_or_keys]…) 

Devuelve el tipo de un valor JSON.

Si el valor no existe, Null serán devueltos.

Ejemplos:

SELECT JSONType('{"a": "hello", "b": [-100, 200.0, 300]}') = 'Object'
SELECT JSONType('{"a": "hello", "b": [-100, 200.0, 300]}', 'a') = 'String'
SELECT JSONType('{"a": "hello", "b": [-100, 200.0, 300]}', 'b') = 'Array'

JSONExtractUInt(json[, indices_or_keys]…) 

JSONExtractInt(json[, indices_or_keys]…) 

JSONExtractFloat(json[, indices_or_keys]…) 

JSONExtractBool(json[, indices_or_keys]…) 

Analiza un JSON y extrae un valor. Estas funciones son similares a visitParam función.

Si el valor no existe o tiene un tipo incorrecto, 0 serán devueltos.

Ejemplos:

SELECT JSONExtractInt('{"a": "hello", "b": [-100, 200.0, 300]}', 'b', 1) = -100
SELECT JSONExtractFloat('{"a": "hello", "b": [-100, 200.0, 300]}', 'b', 2) = 200.0
SELECT JSONExtractUInt('{"a": "hello", "b": [-100, 200.0, 300]}', 'b', -1) = 300

JSONExtractString(json[, indices_or_keys]…) 

Analiza un JSON y extrae una cadena. Esta función es similar a visitParamExtractString función.

Si el valor no existe o tiene un tipo incorrecto, se devolverá una cadena vacía.

El valor es sin escape. Si no se pudo desescapar, devuelve una cadena vacía.

Ejemplos:

SELECT JSONExtractString('{"a": "hello", "b": [-100, 200.0, 300]}', 'a') = 'hello'
SELECT JSONExtractString('{"abc":"\\n\\u0000"}', 'abc') = '\n\0'
SELECT JSONExtractString('{"abc":"\\u263a"}', 'abc') = '☺'
SELECT JSONExtractString('{"abc":"\\u263"}', 'abc') = ''
SELECT JSONExtractString('{"abc":"hello}', 'abc') = ''

JSONExtract(json[, indices_or_keys…], Return_type) 

Analiza un JSON y extrae un valor del tipo de datos ClickHouse dado.

Esta es una generalización de la anterior JSONExtract<type> función.
Esto significa
JSONExtract(..., 'String') devuelve exactamente lo mismo que JSONExtractString(),
JSONExtract(..., 'Float64') devuelve exactamente lo mismo que JSONExtractFloat().

Ejemplos:

SELECT JSONExtract('{"a": "hello", "b": [-100, 200.0, 300]}', 'Tuple(String, Array(Float64))') = ('hello',[-100,200,300])
SELECT JSONExtract('{"a": "hello", "b": [-100, 200.0, 300]}', 'Tuple(b Array(Float64), a String)') = ([-100,200,300],'hello')
SELECT JSONExtract('{"a": "hello", "b": [-100, 200.0, 300]}', 'b', 'Array(Nullable(Int8))') = [-100, NULL, NULL]
SELECT JSONExtract('{"a": "hello", "b": [-100, 200.0, 300]}', 'b', 4, 'Nullable(Int64)') = NULL
SELECT JSONExtract('{"passed": true}', 'passed', 'UInt8') = 1
SELECT JSONExtract('{"day": "Thursday"}', 'day', 'Enum8(\'Sunday\' = 0, \'Monday\' = 1, \'Tuesday\' = 2, \'Wednesday\' = 3, \'Thursday\' = 4, \'Friday\' = 5, \'Saturday\' = 6)') = 'Thursday'
SELECT JSONExtract('{"day": 5}', 'day', 'Enum8(\'Sunday\' = 0, \'Monday\' = 1, \'Tuesday\' = 2, \'Wednesday\' = 3, \'Thursday\' = 4, \'Friday\' = 5, \'Saturday\' = 6)') = 'Friday'

JSONExtractKeysAndValues(json[, indices_or_keys…], Value_type) 

Analiza los pares clave-valor de un JSON donde los valores son del tipo de datos ClickHouse especificado.

Ejemplo:

SELECT JSONExtractKeysAndValues('{"x": {"a": 5, "b": 7, "c": 11}}', 'x', 'Int8') = [('a',5),('b',7),('c',11)]

JSONExtractRaw(json[, indices_or_keys]…) 

Devuelve una parte de JSON como cadena sin analizar.

Si la pieza no existe o tiene un tipo incorrecto, se devolverá una cadena vacía.

Ejemplo:

SELECT JSONExtractRaw('{"a": "hello", "b": [-100, 200.0, 300]}', 'b') = '[-100, 200.0, 300]'

JSONExtractArrayRaw(json[, indices_or_keys…]) 

Devuelve una matriz con elementos de matriz JSON, cada uno representado como cadena sin analizar.

Si la parte no existe o no es una matriz, se devolverá una matriz vacía.

Ejemplo:

SELECT JSONExtractArrayRaw('{"a": "hello", "b": [-100, 200.0, "hello"]}', 'b') = ['-100', '200.0', '"hello"']'

JSONExtractKeysAndValuesRaw 

Extrae datos sin procesar de un objeto JSON.

Sintaxis

JSONExtractKeysAndValuesRaw(json[, p, a, t, h])

Parámetros

  • jsonCadena con JSON válido.
  • p, a, t, h — Comma-separated indices or keys that specify the path to the inner field in a nested JSON object. Each argument can be either a cadena para obtener el campo por la clave o un entero para obtener el campo N-ésimo (indexado desde 1, los enteros negativos cuentan desde el final). Si no se establece, todo el JSON se analiza como el objeto de nivel superior. Parámetro opcional.

Valores devueltos

  • Matriz con ('key', 'value') tuplas. Ambos miembros de tupla son cadenas.
  • Vacíe la matriz si el objeto solicitado no existe o si la entrada JSON no es válida.

Tipo: Matriz(Tupla(Cadena, Cadena).

Ejemplos

Consulta:

SELECT JSONExtractKeysAndValuesRaw('{"a": [-100, 200.0], "b":{"c": {"d": "hello", "f": "world"}}}')

Resultado:

┌─JSONExtractKeysAndValuesRaw('{"a": [-100, 200.0], "b":{"c": {"d": "hello", "f": "world"}}}')─┐
│ [('a','[-100,200]'),('b','{"c":{"d":"hello","f":"world"}}')]                                 │
└──────────────────────────────────────────────────────────────────────────────────────────────┘

Consulta:

SELECT JSONExtractKeysAndValuesRaw('{"a": [-100, 200.0], "b":{"c": {"d": "hello", "f": "world"}}}', 'b')

Resultado:

┌─JSONExtractKeysAndValuesRaw('{"a": [-100, 200.0], "b":{"c": {"d": "hello", "f": "world"}}}', 'b')─┐
│ [('c','{"d":"hello","f":"world"}')]                                                               │
└───────────────────────────────────────────────────────────────────────────────────────────────────┘

Consulta:

SELECT JSONExtractKeysAndValuesRaw('{"a": [-100, 200.0], "b":{"c": {"d": "hello", "f": "world"}}}', -1, 'c')

Resultado:

┌─JSONExtractKeysAndValuesRaw('{"a": [-100, 200.0], "b":{"c": {"d": "hello", "f": "world"}}}', -1, 'c')─┐
│ [('d','"hello"'),('f','"world"')]                                                                     │
└───────────────────────────────────────────────────────────────────────────────────────────────────────┘

Artículo Original

Rating: 2.3 - 26 votes

Was this content helpful?
★★☆☆☆