Как перемещаться по пути объекта json с префиксами пространства имен (например, n1:, n7:) на сервере sql с помощью OPENJSON?

Я хочу получить файлы xml из API (я не могу получить форматы Json из этого API). После этого я хочу преобразовать их в JSON, а затем сохранить в oneDrive с помощью приложения логики. (Я намерен создать таблицы из этих файлов json на сервере Azure SQL)

  1. До сих пор мой подход запускал приложение логики с ответом HTTP GET.

  2. преобразовать полученный XML-файл из шага 1 выше в json с помощью json(xml(triggerBody())) и сохранить его в oneDrive.

Логические шаги приложения: 1) ПОЛУЧИТЬ HTTP-ответ от API 2) Сохраните ответ как json на oneDrive, используя функцию json(xml(triggerBody()))

шаги приложения логики

вот копия xml файла из API:

<?xml version="1.0" encoding="ISO-8859-1"?>
-<n1:VareResult xmlns:n1="http://ABCC.Schemas.Vare/8.0" xmlns:n7="http://ABCC.Schemas.Common/8.0">
-<n1:Header>
-<n1:EksportType>
 <n7:EksportId>0</n7:EksportId>
 <n7:Eksportmetode/>
 <n7:StartIndex>0</n7:StartIndex>
 <n7:BatchSize>2000</n7:BatchSize>
 <n7:TotalCount>1</n7:TotalCount>
 <n7:VersionNr/>
</n1:EksportType>
-<n1:Result> <n7:ResultValue>Success</n7:ResultValue> </n1:Result>
</n1:Header>
-<n1:VareListe>
-<n1:Vare>
 -<n1:Status>
   <n7:Created>2004-06-27T15:30:57.549</n7:Created>
   <n7:Updated>2019-11-20T09:34:03.008</n7:Updated>
 </n1:Status>
<n1:ABCCNr>10203</n1:ABCCNr>
........
........

Вот соответствующий файл json:

{"?xml":{"@version":"1.0","@encoding":"iso-8859-1"},"n1:VareResult":
{"@xmlns:n7":"http://ABCC.Schemas.Common/8.0","@xmlns:n1":"http://ABCC.Schemas.Vare/8.0","n1:Header":
{"n1:EksportType":
{"n7:EksportId":"0","n7:Eksportmetode":null,"n7:StartIndex":"0","n7:BatchSize":"2000","n7:TotalCount":
"1","n7:VersionNr":null},"n1:Result":{"n7:ResultValue":"Success"}},"n1:VareListe":{"n1:Vare":
{"n1:Status":{"n7:Created":"2004-06-27T15:30:57.549","n7:Updated":"2019-11-20T09:34:03.008"},
"n1:ABCCNr":"10203",
........
.......

Как вы видите, файл json также имеет префиксы пространства имен. Я пытаюсь перейти по пути на сервере sql. Вот пример: На изображении ниже показан результат выполнения команды: select * FROM OPENJSON(@jsonObject)

Я хочу получить доступ к значениям ключа n1:VareResult.

Объект JSON на сервере SQL

Я пытался перейти по пути следующим образом: select * FROM OPENJSON (@jsonObject,'$.n1:VareResult' ) Но получаю сообщение об ошибке: "Путь JSON имеет неправильный формат. Неожиданный символ ':' найден в позиции 4."

Есть ли escape-последовательность, которая позволяет мне перемещаться по пути, даже если он содержит эти «запрещенные символы»? Если нет, есть ли способ контролировать преобразование из xml в json на шаге 2 выше, чтобы префиксы пространства имен были опущены для каждого элемента?


person DedicatedLearner    schedule 18.12.2019    source источник


Ответы (2)


Позвольте мне привести вам пример для этого, тогда вы можете попробовать что-то вроде этого:

DECLARE @json NVARCHAR(4000) = N'{  
      "path": {  
            "to":{  
                 "sub-object":["en-GB", "en-UK","de-AT","es-AR","sr-Cyrl"]  
                 }  
              }  
 }';

SELECT [key], value
FROM OPENJSON(@json,'$.path.to."sub-object"')

Дополнительная ссылка:

https://docs.microsoft.com/en-us/sql/t-sql/functions/openjson-transact-sql?view=sql-server-ver15

Надеюсь, поможет.

person Mohit Verma    schedule 18.12.2019

Используя совет из: https://stackoverflow.com/a/45873164/10404094, я добавил двойные кавычки вокруг поля имена на сервере sql, и это сработало. Именно так:

select * FROM OPENJSON (@jsonObject, '$."n1:VareResult"."n1:VareListe"."n1:Vare" ') 

Это исправило мою проблему! Спасибо stackoverflow!

person DedicatedLearner    schedule 18.12.2019