SQLite json_insert()
funkcja pozwala nam wstawić nową wartość do dokumentu JSON.
Podczas wywoływania funkcji jako pierwszy argument przekazujemy oryginalny JSON, po którym następuje ścieżka określająca, gdzie należy wstawić nową wartość, po której następuje wartość do wstawienia.
W razie potrzeby możemy również wstawić wiele par klucz/wartość.
Składnia
Funkcja nazywa się tak:
json_extract(json, path1, value1, path2, value2...)
Gdzie json
reprezentuje oryginalny JSON, a path1, value1, path2, value2...
to pary ścieżka/wartość, których możemy użyć do wstawienia nowych wartości do dokumentu JSON.
Przykład
Oto podstawowy przykład do zademonstrowania:
SELECT json_insert('{ "a" : 1 }', '$.b', 2);
Wynik:
{"a":1,"b":2}
Tutaj wstawiłem nową parę klucz/wartość ("b":2
) do dokumentu JSON.
Możemy wstawić wiele par klucz/wartość w ten sposób:
SELECT json_insert('{ "a" : 1 }', '$.b', 2, '$.c', 3 );
Wynik:
{"a":1,"b":2,"c":3}
Po prostu dodałem więcej argumentów klucz/wartość, gdy wywołałem json_insert()
.
Klucz/wartość już istnieje?
json_insert()
funkcja nie wstawi wartości, jeśli klucz już istnieje:
SELECT json_insert('{ "a" : 1 }', '$.a', 2);
Wynik:
{"a":1}
W tym przypadku klawisz a
już istnieje w JSON, więc próba wstawienia nowej wartości dla tego klucza nie działa.
Aby zastąpić wartość, użyj json_replace()
lub json_set()
.
Wstaw obiekt
Oto przykład wstawiania innego dokumentu JSON:
SELECT json_insert('{ "a" : 1 }', '$.b', json('{ "c" : 2 }') );
Wynik:
{"a":1,"b":{"c":2}}
W tym przypadku użyłem json()
funkcja, aby zwrócić mój argument jako ciąg JSON. Oto, co się dzieje, gdy tego nie robię:
SELECT json_insert('{ "a" : 1 }', '$.b', '{ "c" : 2 }' );
Wynik:
{"a":1,"b":"{ \"c\" : 2 }"}
Dokument JSON jest wstawiany jako wartość tekstowa zamiast obiektu JSON, dlatego jego podwójne cudzysłowy są poprzedzone ukośnikami odwrotnymi.
To jest jednak w porządku. W końcu umieściliśmy nową wartość w pojedynczych cudzysłowach. Skąd SQLite wiedział, czy chcemy wstawić ciąg znaków, czy obiekt JSON?
I nie jest tak, że możemy po prostu usunąć te pojedyncze cudzysłowy:
SELECT json_insert('{ "a" : 1 }', '$.b', { "c" : 2 } );
Wynik:
Parse error: unrecognized token: "{" SELECT json_insert('{ "a" : 1 }', '$.b', { "c" : 2 } ); error here ---^
Bez pojedynczych cudzysłowów lub json()
funkcji, otrzymujemy błąd, gdy tylko napotka lewy nawias klamrowy.
Innym sposobem wstawienia obiektu JSON jest użycie json_object()
funkcja zamiast json()
funkcja:
SELECT json_insert('{ "a" : 1 }', '$.b', json_object('c', 2) );
Wynik:
{"a":1,"b":{"c":2}}
Wstaw tablicę
Podobnie jest z wstawianiem tablic:
SELECT json_insert('{ "a" : 1 }', '$.b', json('[ 2, 3, 4 ]'));
Wynik:
{"a":1,"b":[2,3,4]}
Jeśli usuniemy json()
funkcja, otrzymujemy to:
SELECT json_insert('{ "a" : 1 }', '$.b', '[ 2, 3, 4 ]');
Wynik:
{"a":1,"b":"[ 2, 3, 4 ]"}
A jeśli usuniemy pojedyncze cudzysłowy, otrzymamy błąd:
SELECT json_insert('{ "a" : 1 }', '$.b', [ 2, 3, 4 ]);
Wynik:
Parse error: no such column: 2, 3, 4 SELECT json_insert('{ "a" : 1 }', '$.b', [ 2, 3, 4 ]); error here ---^
Możemy alternatywnie użyć json_array()
funkcja zamiast json()
. Ta funkcja umożliwia utworzenie tablicy na podstawie jej argumentów:
SELECT json_insert('{ "a" : 1 }', '$.b', json_array( 2, 3, 4 ) );
Wynik:
{"a":1,"b":[2,3,4]}
Dołącz wartości na końcu tablicy
Możemy użyć json_insert()
aby dołączyć wartości na końcu tablicy.
Aby to zrobić, użyj indeksu tablicy [#]
:
SELECT json_insert('[ 1, 2, 3 ]', '$[#]', 4 );
Wynik:
[1,2,3,4]
Ta sama zasada dotyczy tablic zagnieżdżonych:
SELECT json_insert('[ 1, [ "a", "b" ], 3 ]', '$[1][#]', "c" );
Wynik:
[1,["a","b","c"],3]
Nieprawidłowe ścieżki
Otrzymamy błąd, jeśli nasza ścieżka nie jest dobrze uformowana:
SELECT json_insert('{ "a" : 1 }', 'b', 2);
Wynik:
Runtime error: JSON path error near 'b'
W tym przypadku zapomniałem dołączyć $.
z przodu ścieżki.
Nieprawidłowe dokumenty JSON
Otrzymamy również błąd, że JSON nie jest poprawnie sformułowany:
SELECT json_insert('{ "a" : 1', '$.b', 2);
Wynik:
Runtime error: malformed JSON
Tym razem błąd mówi nam, że nasz JSON jest zniekształcony.