Recherche…


Modifier la valeur en texte JSON sur le chemin spécifié

La fonction JSON_MODIFY utilise le texte JSON comme paramètre d'entrée et modifie une valeur sur le chemin spécifié à l'aide du troisième argument:

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}

En conséquence, nous aurons un nouveau texte JSON avec "Prix": 39.99 et aucune autre valeur ne sera modifiée. Si l'objet sur le chemin spécifié n'existe pas, JSON_MODIFY insérera la paire clé: valeur.

Pour supprimer la paire clé: valeur, mettez NULL comme nouvelle valeur:

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 supprimera par défaut la clé si elle n'a pas de valeur, vous pouvez donc l'utiliser pour supprimer une clé.

Ajouter une valeur scalaire dans un tableau JSON

JSON_MODIFY a le mode 'append' qui ajoute de la valeur dans le tableau.

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"]}

Si le tableau sur le chemin spécifié n'existe pas, JSON_MODIFY (append) créera un nouveau tableau avec un seul élément:

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"]}

Insérer un nouvel objet JSON dans le texte JSON

La fonction JSON_MODIFY vous permet d'insérer des objets JSON dans du texte 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}}

Comme le troisième paramètre est un texte, vous devez l’emballer avec la fonction JSON_QUERY pour "lancer" du texte en JSON. Sans cette "distribution", JSON_MODIFY traitera le troisième paramètre comme du texte brut et des caractères d'échappement avant de l'insérer en tant que valeur de chaîne. Sans JSON_QUERY, les résultats seront:

{"Id":1,"Name":"Toy Car","Price":'{\"Min\":34.99,\"Recommended\":45.49}'}

JSON_MODIFY insérera cet objet s'il n'existe pas ou le supprimera si la valeur du troisième paramètre est NULL.

Insérer un nouveau tableau JSON généré avec la requête FOR JSON

Vous pouvez générer un objet JSON en utilisant la requête SELECT standard avec la clause FOR JSON et l'insérer dans le texte JSON en tant que troisième paramètre:

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 saura que la requête select avec la clause FOR JSON génère un tableau JSON valide et l'insère simplement dans le texte JSON.

Vous pouvez utiliser toutes les options FOR JSON dans la requête SELECT, à l' exception de WITHOUT_ARRAY_WRAPPER , qui générera un objet unique au lieu d'un tableau JSON. Voir un autre exemple dans cette rubrique pour voir comment insérer un objet JSON unique.

Insérer un objet JSON unique généré avec la clause FOR JSON

Vous pouvez générer un objet JSON à l'aide d'une requête SELECT standard avec la clause FOR JSON et l'option WITHOUT_ARRAY_WRAPPER, puis l'insérer dans un texte JSON en tant que troisième paramètre:

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 avec l'option WITHOUT_ARRAY_WRAPPER peut générer du texte JSON non valide si la requête SELECT renvoie plusieurs résultats (vous devez utiliser TOP 1 ou filtrer par clé primaire dans ce cas). Par conséquent, JSON_MODIFY supposera que le résultat renvoyé est simplement un texte brut et l’échappe comme tout autre texte si vous ne l’emballez pas avec la fonction JSON_QUERY.

Vous devez envelopper la requête FOR JSON, WITHOUT_ARRAY_WRAPPER avec la fonction JSON_QUERY afin de convertir le résultat en JSON.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow