SQLite json_replace()
funkcja pozwala nam zastąpić istniejącą wartość w dokumencie JSON inną wartością.
Gdy wywołujemy funkcję, jako pierwszy argument przekazujemy oryginalny JSON, po którym następuje ścieżka wartości do zastąpienia, po której następuje wartość do zastąpienia.
W razie potrzeby możemy również zastąpić wiele par klucz/wartość.
Składnia
Działa to tak:
json_replace(json, path1, value1, path2, value2...)
Gdzie json
reprezentuje oryginalny JSON, a path1, value1, path2, value2...
są parami ścieżka/wartość do zastąpienia.
Przykład
Oto podstawowy przykład do zademonstrowania:
SELECT json_replace('{ "name" : "Fluffy" }', '$.name', "Baldy");
Wynik:
{"name":"Baldy"}
Tutaj zaktualizowałem wartość name
klucz od Fluffy
do Baldy
.
Możemy zaktualizować wiele par klucz/wartość w ten sposób:
SELECT json_replace('{
"name" : "Fluffy",
"age" : 10
}',
'$.name', "Baldy",
'$.age', 11
);
Wynik:
{"name":"Baldy","age":11}
Po prostu dodałem więcej argumentów klucz/wartość, gdy wywołałem json_replace()
.
Tutaj użyłem łamania linii, aby kod był łatwiejszy do odczytania. Wszystko mogło być na jednej linii – wynik byłby taki sam.
Co jeśli klucz nie istnieje?
Jeśli klucz nie istnieje jeszcze w JSON, nic nie jest zastępowane:
SELECT json_replace('{ "name" : "Fluffy" }', '$.age', 11);
Wynik:
{"name":"Fluffy"}
Jest to główna cecha wyróżniająca json_replace()
funkcja z json_set()
i json_insert()
Funkcje. Te funkcje wstawią wartość, jeśli klucz jeszcze nie istnieje.
Jednak możliwe jest efektywne wstawianie nowych kluczy za pomocą json_replace()
poprzez zastąpienie całego obiektu/dokumentu JSON. Przykład poniżej.
Zastąp cały dokument JSON
Możemy użyć json_replace()
zastąpić cały dokument JSON innym:
SELECT json_replace('{ "name" : "Fluffy" }', '$', json('{ "name" : "Baldy" }') );
Wynik:
{"name":"Baldy"}
Dzięki temu możemy skutecznie wstawiać nowe klucze do dokumentu:
SELECT json_replace('{
"name" : "Fluffy"
}',
'$',
json('{
"name" : "Baldy" ,
"age" : 11
}'
)
);
Wynik:
{"name":"Baldy","age":11}
Ściśle mówiąc, nie włożyliśmy żadnych nowych kluczy. Po prostu wymieniliśmy cały dokument. Ale w rezultacie powstał dokument JSON zawierający klucze, których oryginalny nie zawierał.
Zamień osadzony obiekt
Możemy również zastąpić osadzone obiekty:
SELECT json_replace('
{
"a" : 1,
"b" : { "c" : 1 }
}',
'$.b',
json('{ "c" : 2 }')
);
Wynik:
{"a":1,"b":{"c":2}}
Kiedy to zrobiłem, 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_replace('
{
"a" : 1,
"b" : { "c" : 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.
Nie możemy jednak po prostu usunąć pojedynczych cudzysłowów, ponieważ powoduje to błąd:
SELECT json_replace('
{
"a" : 1,
"b" : { "c" : 1 }
}',
'$.b',
{ "c" : 2 }
);
Wynik:
Parse error: unrecognized token: "{" "b" : { "c" : 1 } }', '$.b', { "c" : 2 } ); error here ---^
Bez pojedynczych cudzysłowów lub json()
funkcji, otrzymujemy błąd, gdy tylko napotka lewy nawias klamrowy. Dlatego musimy użyć pojedynczych cudzysłowów lub json()
funkcji, w zależności od tego, czy wstawiamy obiekt JSON, czy ciąg/wartość tekstową SQL.
Innym sposobem wstawienia obiektu JSON jest użycie json_object()
funkcja zamiast json()
funkcja:
SELECT json_replace('
{
"a" : 1,
"b" : { "c" : 1 }
}',
'$.b',
json_object('c', 2)
);
Wynik:
{"a":1,"b":{"c":2}}
Zamień tablicę
Ta sama koncepcja dotyczy tablic:
SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', json('[ 5, 6, 7 ]'));
Wynik:
{"a":[5,6,7]}
Jeśli usuniemy json()
funkcja, otrzymujemy to:
SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', '[ 5, 6, 7 ]');
Wynik:
{"a":"[ 5, 6, 7 ]"}
A jeśli usuniemy pojedyncze cudzysłowy, otrzymamy błąd:
SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', [ 5, 6, 7 ]);
Wynik:
Parse error: no such column: 5, 6, 7 (17) LECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', [ 5, 6, 7 ]); 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_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', json_array(5, 6, 7));
Wynik:
{"a":[5,6,7]}
Dołącz wartości na końcu tablicy
Aby dołączyć wartości na końcu tablicy, możemy użyć funkcji json_insert()
lub json_set()
Funkcje.
Jeśli jednak musimy użyć json_replace()
, możemy zastąpić całą tablicę inną, która ma dodatkowe wartości dodane na końcu tablicy:
SELECT json_replace('[ 1, 2, 3 ]', '$', json('[ 1, 2, 3, 4 ]') );
Wynik:
[1,2,3,4]
Ale jak wspomniano, json_insert()
i json_set()
pozwalają na faktyczne dołączanie wartości do tablicy bez zastępowania całej tablicy.
Zamień elementy tablicy
Oto przykład użycia json_replace()
aby zastąpić element w tablicy:
SELECT json_replace('[ 1, 2, 3 ]', '$[1]', 4 );
Wynik:
[1,4,3]
Tablice są oparte na zerach, więc [1]
wskazuje drugi element tablicy.
json_set()
funkcja może być również wykorzystana do zastąpienia istniejących elementów. Jednak json_insert()
funkcja nie pozwala nam na podmianę istniejących elementów.
Nieprawidłowe ścieżki
Otrzymamy błąd, jeśli nasza ścieżka nie jest dobrze uformowana:
SELECT json_replace('{ "a" : 1 }', 'a', 2);
Wynik:
Runtime error: JSON path error near 'a'
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_replace('{ "a" : 1', '$.a', 2);
Wynik:
Runtime error: malformed JSON
Tym razem błąd mówi nam, że nasz JSON jest zniekształcony.