Microsoft SQL Server
Zmodyfikuj tekst JSON
Szukaj…
Zmodyfikuj wartość w tekście JSON na określonej ścieżce
Funkcja JSON_MODIFY wykorzystuje tekst JSON jako parametr wejściowy i modyfikuje wartość w określonej ścieżce za pomocą trzeciego argumentu:
declare @json nvarchar(4000) = N'{"Id":1,"Name":"Toy Car","Price":34.99}'
set @json = JSON_MODIFY(@json, '$.Price', 39.99)
print @json -- Output: {"Id":1,"Name":"Toy Car","Price":39.99}
W rezultacie otrzymamy nowy tekst JSON z „Cena”: 39,99, a inna wartość nie zostanie zmieniona. Jeśli obiekt na podanej ścieżce nie istnieje, JSON_MODIFY wstawi parę klucz: wartość.
Aby usunąć parę klucz: wartość, ustaw NULL jako nową wartość:
declare @json nvarchar(4000) = N'{"Id":1,"Name":"Toy Car","Price":34.99}'
set @json = JSON_MODIFY(@json, '$.Price', NULL)
print @json -- Output: {"Id":1,"Name":"Toy Car"}
JSON_MODIFY domyślnie usunie klucz, jeśli nie ma wartości, więc można go użyć do usunięcia klucza.
Dodaj wartość skalarną do tablicy JSON
JSON_MODIFY ma tryb „append”, który dodaje wartość do tablicy.
declare @json nvarchar(4000) = N'{"Id":1,"Name":"Toy Car","Tags":["toy","game"]}'
set @json = JSON_MODIFY(@json, 'append $.Tags', 'sales')
print @json -- Output: {"Id":1,"Name":"Toy Car","Tags":["toy","game","sales"]}
Jeśli tablica na podanej ścieżce nie istnieje, JSON_MODIFY (append) utworzy nową tablicę z jednym elementem:
declare @json nvarchar(4000) = N'{"Id":1,"Name":"Toy Car","Price":34.99}'
set @json = JSON_MODIFY(@json, 'append $.Tags', 'sales')
print @json -- Output {"Id":1,"Name":"Toy Car","Tags":["sales"]}
Wstaw nowy obiekt JSON do tekstu JSON
Funkcja JSON_MODIFY umożliwia wstawianie obiektów JSON do tekstu JSON:
declare @json nvarchar(4000) = N'{"Id":1,"Name":"Toy Car"}'
set @json = JSON_MODIFY(@json, '$.Price',
JSON_QUERY('{"Min":34.99,"Recommended":45.49}'))
print @json
-- Output: {"Id":1,"Name":"Toy Car","Price":{"Min":34.99,"Recommended":45.49}}
Ponieważ trzecim parametrem jest tekst, musisz owinąć go funkcją JSON_QUERY, aby „rzutować” tekst na JSON. Bez tego „rzutowania” JSON_MODIFY potraktuje trzeci parametr jako zwykły tekst i znaki specjalne przed wstawieniem go jako wartości ciągu. Bez JSON_QUERY wyniki będą:
{"Id":1,"Name":"Toy Car","Price":'{\"Min\":34.99,\"Recommended\":45.49}'}
JSON_MODIFY wstawi ten obiekt, jeśli nie istnieje, lub usunie go, jeśli wartość trzeciego parametru to NULL.
Wstaw nową tablicę JSON wygenerowaną za pomocą zapytania FOR JSON
Możesz wygenerować obiekt JSON za pomocą standardowego zapytania SELECT z klauzulą FOR JSON i wstawić go do tekstu JSON jako trzeci parametr:
declare @json nvarchar(4000) = N'{"Id":17,"Name":"WWI"}'
set @json = JSON_MODIFY(@json, '$.tables',
(select name from sys.tables FOR JSON PATH) )
print @json
(1 row(s) affected)
{"Id":1,"Name":"master","tables":[{"name":"Colors"},{"name":"Colors_Archive"},{"name":"OrderLines"},{"name":"PackageTypes"},{"name":"PackageTypes_Archive"},{"name":"StockGroups"},{"name":"StockItemStockGroups"},{"name":"StockGroups_Archive"},{"name":"StateProvinces"},{"name":"CustomerTransactions"},{"name":"StateProvinces_Archive"},{"name":"Cities"},{"name":"Cities_Archive"},{"name":"SystemParameters"},{"name":"InvoiceLines"},{"name":"Suppliers"},{"name":"StockItemTransactions"},{"name":"Suppliers_Archive"},{"name":"Customers"},{"name":"Customers_Archive"},{"name":"PurchaseOrders"},{"name":"Orders"},{"name":"People"},{"name":"StockItems"},{"name":"People_Archive"},{"name":"ColdRoomTemperatures"},{"name":"ColdRoomTemperatures_Archive"},{"name":"VehicleTemperatures"},{"name":"StockItems_Archive"},{"name":"Countries"},{"name":"StockItemHoldings"},{"name":"sysdiagrams"},{"name":"PurchaseOrderLines"},{"name":"Countries_Archive"},{"name":"DeliveryMethods"},{"name":"DeliveryMethods_Archive"},{"name":"PaymentMethods"},{"name":"SupplierTransactions"},{"name":"PaymentMethods_Archive"},{"name":"TransactionTypes"},{"name":"SpecialDeals"},{"name":"TransactionTypes_Archive"},{"name":"SupplierCategories"},{"name":"SupplierCategories_Archive"},{"name":"BuyingGroups"},{"name":"Invoices"},{"name":"BuyingGroups_Archive"},{"name":"CustomerCategories"},{"name":"CustomerCategories_Archive"}]}
JSON_MODIFY będzie wiedział, że zapytanie select z klauzulą FOR JSON generuje prawidłową tablicę JSON i po prostu wstawi ją do tekstu JSON.
Możesz użyć wszystkich opcji FOR JSON w zapytaniu SELECT, z wyjątkiem WITHOUT_ARRAY_WRAPPER , który wygeneruje pojedynczy obiekt zamiast tablicy JSON. Zobacz inny przykład w tym temacie, aby zobaczyć, jak wstawić pojedynczy obiekt JSON.
Wstaw pojedynczy obiekt JSON wygenerowany za pomocą klauzuli FOR JSON
Możesz wygenerować obiekt JSON za pomocą standardowego zapytania SELECT z klauzulą FOR JSON i opcją WITHOUT_ARRAY_WRAPPER i wstawić go do tekstu JSON jako trzeci parametr:
declare @json nvarchar(4000) = N'{"Id":17,"Name":"WWI"}'
set @json = JSON_MODIFY(@json, '$.table',
JSON_QUERY(
(select name, create_date, schema_id
from sys.tables
where name = 'Colors'
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER)))
print @json
(1 row(s) affected)
{"Id":17,"Name":"WWI","table":{"name":"Colors","create_date":"2016-06-02T10:04:03.280","schema_id":13}}
FOR JSON z opcją WITHOUT_ARRAY_WRAPPER może generować niepoprawny tekst JSON, jeśli zapytanie SELECT zwróci więcej niż jeden wynik (w takim przypadku należy użyć TOP 1 lub filtrować według klucza podstawowego). Dlatego JSON_MODIFY przyjmie, że zwrócony wynik jest zwykłym tekstem i unika go jak każdy inny tekst, jeśli nie zostanie zawinięty za pomocą funkcji JSON_QUERY.
Powinieneś zawinąć zapytanie FOR JSON, WITHOUT_ARRAY_WRAPPER funkcją JSON_QUERY , aby rzutować wynik na JSON.