W SQLite json()
funkcja konwertuje nieprzetworzony tekst, który wygląda jak JSON na rzeczywisty JSON.
Gdy wywołujemy funkcję, przekazujemy ciąg JSON jako argument. json()
funkcja następnie sprawdza, czy argument jest prawidłowym ciągiem JSON i zwraca zminimalizowaną wersję tego ciągu JSON. Jeśli argument nie jest poprawnie sformułowanym ciągiem JSON, zgłaszany jest błąd.
Jednak json()
funkcja nie została zaprojektowana do testowania, czy wartość jest poprawnym JSON. Aby to zrobić, użyj json_valid()
zamiast tego.
Składnia
json(X)
Gdzie X
to wartość do sprawdzenia i zminimalizowania.
Przykład
SELECT json('{ "a": 1 }');
Wynik:
{"a":1}
W tym przypadku podałem prawidłowy dokument JSON, więc została zwrócona jego zminimalizowana wersja (niepotrzebne spacje zostały usunięte).
Oto przykład, który używa większego dokumentu JSON z większą ilością spacji:
SELECT json('{
"_id": 1.0,
"title": "Animals",
"body": "blah blah 1",
"tags": [
"cats",
"dogs"
]
}');
Wynik:
{"_id":1.0,"title":"Animals","body":"blah blah 1","tags":["cats","dogs"]}
json()
funkcja może być przydatna, gdy musisz przekazać JSON do innej funkcji. Jak wspomniano, konwertuje surowy tekst, który wygląda jak JSON, na rzeczywisty JSON, co czyni go idealnym rozwiązaniem, gdy musisz przekazać go do innej funkcji. Druga funkcja zinterpretuje następnie wartość jako JSON, a nie ciąg.
Nieprawidłowy JSON
Przekazanie nieprawidłowego ciągu JSON powoduje błąd:
SELECT json('{oops!');
Wynik:
Runtime error: malformed JSON
Zduplikowane etykiety
Jeśli dokument JSON zawiera zduplikowane etykiety, nie ma gwarancji, że zawsze zostaną zachowane.
W momencie pisania zachowywane są zduplikowane etykiety. Jednak dokumentacja SQLite informuje, że może się to zmienić w przyszłej wersji SQLite, tak aby zduplikowane etykiety były dyskretnie usuwane.
Oto przykład, który używa dokumentu JSON ze zduplikowanymi etykietami:
SELECT json('{ "a": 1, "b": 1, "a" : 2 }');
Wynik:
{"a":1,"b":1,"a":2}
W tym przypadku mój dokument JSON ma dwie etykiety o nazwie a
. Oba zostały zachowane w mojej instalacji SQLite (wersja 3.38.0), ale nie zawsze tak będzie w przyszłych wersjach SQLite.