Как вернуть свойство JSON (SQL Server)

Я пытаюсь выбрать некоторые данные, которые хранятся в формате JSON в SQL Server.

Когда я запускаю isjson для строки, он возвращает 1.

Однако я не могу разобрать его.

declare @testStr nvarchar(max) = '{"order":{"address":{"shipToAddLine1":"1234 ABC Dr","shipToCityStZip":"Washington, DC 00000"}}}'
select isjson(@testStr)                 -- returns 1
select json_value(@testStr, '$').       -- returns null
select json_value(@testStr, '$.order')  -- returns null
select @testStr                         -- returns entire string

Как выбрать узел order из тестовой строки @testStr ?

Всего 2 ответа


Вы не можете использовать JSON_VALUE потому что это не скалярное значение, вам нужно использовать вместо него JSON_QUERY . Примером скалярного значения может служить поле shipToAddLine1 : select json_value(@testStr, '$.order.address.shipToAddLine1') .

Использование JSON_QUERY для получения заказа будет:

select json_query(@testStr, '$.order')

Результат:

{"address": {"shipToAddLine1": "1234 ABC Dr", "shipToCityStZip": "Вашингтон, округ Колумбия, 00000"}}


Вы можете использовать JSON_VALUE() , JSON_QUERY() и OPENJSON() для анализа входного JSON. Важно упомянуть следующее:

  • Функция JSON_QUERY извлекает объект или массив из строки JSON . Если значение не является объектом или массивом, результатом будет NULL в lax режиме и ошибка в strict режиме.
  • Функция JSON_VALUE извлекает скалярное значение из строки JSON . Если path указывает на не скалярное значение, результат равен NULL в lax режиме и ошибка в strict режиме
  • Если вы хотите проанализировать строку JSON и получить результаты в виде таблицы, используйте OPENJSON функцию OPENJSON .

Если вам нужно извлечь ключ order вас есть два варианта - JSON_QUERY() или OPENJSON() . Следующий оператор демонстрирует, как извлечь объект JSON (из ключа $.order ) и значения JSON (из $.order.address.shipToAddLine1 и $.order.address.shipToCityStZip ):

DECLARE @testStr nvarchar(max) = 
N'{
   "order":{
      "address":{
         "shipToAddLine1":"1234 ABC Dr",
         "shipToCityStZip":"Washington, DC 00000"
      }
   }
}'

-- or

SELECT 
   shipToAddLine1 = JSON_VALUE(@testStr, '$.order.address.shipToAddLine1'),
   shipToCityStZip = JSON_VALUE(@testStr, '$.order.address.shipToCityStZip'),
   [order] = JSON_QUERY(@testStr, '$.order')

SELECT shipToAddLine1, shipToCityStZip, [order]
FROM OPENJSON(@testStr) WITH (
   shipToAddLine1 nvarchar(100) '$.order.address.shipToAddLine1',
   shipToCityStZip nvarchar(100) '$.order.address.shipToCityStZip' ,
   [order] nvarchar(max) '$.order' AS JSON
)

Результат:

shipToAddLine1  shipToCityStZip         order
1234 ABC Dr     Washington, DC 00000    {
                                           "address":{
                                              "shipToAddLine1":"1234 ABC Dr",
                                              "shipToCityStZip":"Washington, DC 00000"
                                           }
                                        }

Есть идеи?

10000