I SQLite, json()
funktion konverterar råtext som ser ut som JSON till faktisk JSON.
Vi skickar en JSON-sträng som ett argument när vi anropar funktionen. json()
funktionen kontrollerar sedan att argumentet är en giltig JSON-sträng och returnerar en minifierad version av den JSON-strängen. Om argumentet inte är en välformad JSON-sträng, skapas ett fel.
Men json()
funktion var inte utformad för att testa om ett värde är giltigt JSON eller inte. För att göra det, använd json_valid()
funktion istället.
Syntax
json(X)
Där X
är värdet som ska kontrolleras och förminskas.
Exempel
SELECT json('{ "a": 1 }');
Resultat:
{"a":1}
I det här fallet tillhandahöll jag ett giltigt JSON-dokument, så en minifierad version av det returnerades (onödiga blanksteg togs bort).
Här är ett exempel som använder ett större JSON-dokument med fler utrymmen:
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 vara användbar när du behöver skicka JSON till en annan funktion. Som nämnt konverterar den råtext som ser ut som JSON till faktisk JSON, vilket gör den idealisk för när du behöver skicka den till den andra funktionen. Den andra funktionen kommer då att tolka värdet som JSON snarare än en sträng.
Ogiltig JSON
Att skicka en ogiltig JSON-sträng resulterar i ett fel:
SELECT json('{oops!');
Resultat:
Runtime error: malformed JSON
Duplicera etiketter
Om ett JSON-dokument innehåller dubbletter av etiketter finns det ingen garanti för att de alltid kommer att bevaras.
I skrivande stund finns dubbletter av etiketter bevarade. SQLite-dokumentationen rekommenderar dock att detta kan ändras i en framtida version av SQLite, så att dubbletter av etiketter tas bort i tysthet.
Här är ett exempel som använder ett JSON-dokument med dubbletter av etiketter:
SELECT json('{ "a": 1, "b": 1, "a" : 2 }');
Resultat:
{"a":1,"b":1,"a":2}
I det här fallet har mitt JSON-dokument två etiketter som heter a
. Båda bevarades i min SQLite-installation (version 3.38.0), men detta kanske inte alltid är fallet i framtida SQLite-versioner.