I SQLite er json()
funktion konverterer rå tekst, der ligner JSON, til faktisk JSON.
Vi sender en JSON-streng som et argument, når vi kalder funktionen. json()
funktionen kontrollerer derefter, at argumentet er en gyldig JSON-streng og returnerer en minificeret version af den JSON-streng. Hvis argumentet ikke er en velformet JSON-streng, bliver der kastet en fejl.
Men json()
funktion blev ikke designet til at teste, om en værdi er gyldig JSON eller ej. For at gøre det skal du bruge json_valid()
funktion i stedet for.
Syntaks
json(X)
Hvor X
er den værdi, der skal kontrolleres og minificeres.
Eksempel
SELECT json('{ "a": 1 }');
Resultat:
{"a":1}
I dette tilfælde leverede jeg et gyldigt JSON-dokument, og derfor blev en minificeret version af det returneret (unødvendige mellemrum blev fjernet).
Her er et eksempel, der bruger et større JSON-dokument med flere mellemrum:
SELECT json('{
"_id": 1.0,
"title": "Animals",
"body": "blah blah 1",
"tags": [
"cats",
"dogs"
]
}');
Resultat:
{"_id":1.0,"title":"Animals","body":"blah blah 1","tags":["cats","dogs"]}
json()
funktion kan være nyttig, når du skal overføre JSON til en anden funktion. Som nævnt konverterer den rå tekst, der ligner JSON, til faktisk JSON, hvilket gør den ideel, når du skal overføre den til den anden funktion. Den anden funktion vil så fortolke værdien som JSON i stedet for en streng.
Ugyldig JSON
Sending af en ugyldig JSON-streng resulterer i en fejl:
SELECT json('{oops!');
Resultat:
Runtime error: malformed JSON
Dublerede etiketter
Hvis et JSON-dokument indeholder duplikerede etiketter, er der ingen garanti for, at de altid vil blive bevaret.
I skrivende stund er duplikerede etiketter bevaret. SQLite-dokumentationen råder dog til, at dette kan ændre sig i en fremtidig version af SQLite, så duplikerede etiketter fjernes i det stille.
Her er et eksempel, der bruger et JSON-dokument med duplikerede etiketter:
SELECT json('{ "a": 1, "b": 1, "a" : 2 }');
Resultat:
{"a":1,"b":1,"a":2}
I dette tilfælde har mit JSON-dokument to etiketter kaldet a
. Begge blev bevaret i min SQLite-installation (version 3.38.0), men det er muligvis ikke altid tilfældet i fremtidige SQLite-versioner.