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.