SQLite json_set()
funkcja pozwala nam wstawić lub zastąpić wartość w dokumencie JSON.
Gdy wywołujemy funkcję, jako pierwszy argument przekazujemy oryginalny JSON, po którym następuje ścieżka określająca, gdzie wstawić/zamienić nową wartość, po której następuje wartość do wstawienia/zastąpienia.
W razie potrzeby możemy również wstawić/zamienić wiele par klucz/wartość.
Składnia
Działa to tak:
json_set(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 (lub zastąpienia, w zależności od przypadku).
Przykład
Oto podstawowy przykład do zademonstrowania:
SELECT json_set('{ "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_set('{ "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_set()
.
Zamień wartości
Jeśli klucz już istnieje, jego wartość jest zastępowana nową wartością:
SELECT json_set('{ "a" : 1, "b" : 2 }', '$.b', 3);
Wynik:
{"a":1,"b":3}
To jest główna różnica między json_set()
i json_insert()
. json_insert()
funkcja nie wstawi wartości, jeśli klucz już istnieje.
Innym sposobem na zastąpienie wartości jest użycie json_replace()
.
Wstaw obiekt
Oto przykład wstawiania obiektu JSON:
SELECT json_set('{ "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_set('{ "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.
Jednak samo usunięcie pojedynczych cudzysłowów powoduje błąd:
SELECT json_set('{ "a" : 1 }', '$.b', { "c" : 2 } );
Wynik:
Parse error: unrecognized token: "{" SELECT json_set('{ "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_set('{ "a" : 1 }', '$.b', json_object('c', 2) );
Wynik:
{"a":1,"b":{"c":2}}
Wstaw tablicę
Podobnie jest z wstawianiem tablic:
SELECT json_set('{ "a" : 1 }', '$.b', json('[ 2, 3, 4 ]'));
Wynik:
{"a":1,"b":[2,3,4]}
Jeśli usuniemy json()
funkcja, otrzymujemy to:
SELECT json_set('{ "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_set('{ "a" : 1 }', '$.b', [ 2, 3, 4 ]);
Wynik:
Parse error: no such column: 2, 3, 4 SELECT json_set('{ "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_set('{ "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_set()
aby dołączyć wartości na końcu tablicy.
Aby to zrobić, użyj indeksu tablicy [#]
:
SELECT json_set('[ 1, 2, 3 ]', '$[#]', 4 );
Wynik:
[1,2,3,4]
Ta sama zasada dotyczy tablic zagnieżdżonych:
SELECT json_set('[ 1, [ "a", "b" ], 3 ]', '$[1][#]', "c" );
Wynik:
[1,["a","b","c"],3]
Zamień elementy tablicy
Możemy użyć json_set()
aby zastąpić elementy w tablicy:
SELECT json_set('[ 1, 2, 3 ]', '$[1]', 4 );
Wynik:
[1,4,3]
Tablice są oparte na zerach, więc [1]
wskazuje drugi element tablicy.
json_replace()
funkcja może być również wykorzystana do zastąpienia istniejących elementów. Ponownie, różni się to od json_insert()
, który nie zastępuje istniejących elementów.
Nieprawidłowe ścieżki
Otrzymamy błąd, jeśli nasza ścieżka nie jest dobrze uformowana:
SELECT json_set('{ "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_set('{ "a" : 1', '$.b', 2);
Wynik:
Runtime error: malformed JSON
Tym razem błąd mówi nam, że nasz JSON jest zniekształcony.