En SQLite, json()
La función convierte texto sin formato que parece JSON en JSON real.
Pasamos una cadena JSON como argumento cuando llamamos a la función. El json()
Luego, la función verifica que el argumento sea una cadena JSON válida y devuelve una versión minimizada de esa cadena JSON. Si el argumento no es una cadena JSON bien formada, se genera un error.
Sin embargo, el json()
La función no se diseñó para probar si un valor es JSON válido o no. Para hacer eso, use json_valid()
en su lugar.
Sintaxis
json(X)
Donde X
es el valor a comprobar y minimizar.
Ejemplo
SELECT json('{ "a": 1 }');
Resultado:
{"a":1}
En este caso, proporcioné un documento JSON válido, por lo que se devolvió una versión reducida (se eliminaron los espacios innecesarios).
Aquí hay un ejemplo que usa un documento JSON más grande con más espacios:
SELECT json('{
"_id": 1.0,
"title": "Animals",
"body": "blah blah 1",
"tags": [
"cats",
"dogs"
]
}');
Resultado:
{"_id":1.0,"title":"Animals","body":"blah blah 1","tags":["cats","dogs"]}
El json()
La función puede ser útil cuando necesita pasar JSON a otra función. Como se mencionó, convierte texto sin procesar que parece JSON en JSON real, lo que lo hace ideal para cuando necesita pasarlo a la otra función. La otra función interpretará el valor como JSON en lugar de una cadena.
JSON no válido
Pasar una cadena JSON no válida da como resultado un error:
SELECT json('{oops!');
Resultado:
Runtime error: malformed JSON
Etiquetas duplicadas
Si un documento JSON contiene etiquetas duplicadas, no hay garantía de que siempre se conserven.
En el momento de redactar este documento, se conservan etiquetas duplicadas. Sin embargo, la documentación de SQLite advierte que esto podría cambiar en una versión futura de SQLite, por lo que las etiquetas duplicadas se eliminan silenciosamente.
Aquí hay un ejemplo que usa un documento JSON con etiquetas duplicadas:
SELECT json('{ "a": 1, "b": 1, "a" : 2 }');
Resultado:
{"a":1,"b":1,"a":2}
En este caso, mi documento JSON tiene dos etiquetas llamadas a
. Ambos se conservaron en mi instalación de SQLite (versión 3.38.0), pero es posible que no siempre sea así en futuras versiones de SQLite.