#azure-logic-apps
#azure-logic-apps
Вопрос:
У меня есть JSON, исходящий из действия ‘SQLServer GetRecords (V2)’, подобного следующему. К сожалению, ответ не будет содержать полей с нулевыми значениями. В моем примере поле ‘Name’ для некоторых элементов равно null.
[
{
"@odata.etag": "",
"ItemInternalId": "378fd3bc-0cd4-4171-8e7d-462461086580",
"RowID": 1,
"Name": "1234"
},
{
"@odata.etag": "",
"ItemInternalId": "378fd3bc-0cd4-4171-8e7d-462461086580",
"RowID": 1
}, ...
}
Я хочу повторить эти элементы и передать каждый элемент другой конечной точке HTTP.
Когда я использую item()[‘Name’] или item()?[‘Name’] для доступа к полю name для второго элемента, говорящего
Выражение языка шаблонов не может быть вычислено, поскольку свойство ‘Name’ не существует, доступные свойства есть …
Я вижу, что многие люди используют функцию xpath в сочетании с функцией xml для извлечения значения.
https://learn.microsoft.com/en-us/azure/logic-apps/workflow-definition-language-functions-reference
Но когда я использую что-то вроде xpath(xml(item()), ‘/Name’), оно выдает ошибку со словами
Параметр функции языка шаблонов ‘xml’ недопустим. Предоставленное значение не может быть преобразовано в XML: ‘Корневой объект JSON имеет свойство ‘@odata.etag’, которое будет преобразовано в атрибут. Корневой объект не может иметь никаких свойств атрибута. Рассмотрите возможность указания имени элемента DeserializeRootElementName. Путь ‘[‘@odata.etag’]’.’. Пожалуйста, смотрите https://aka.ms/logicexpressions#xml для получения подробной информации об использовании.
Обновление 1
Я получил это, работая со следующим выражением, мне действительно это не нравится
first(xpath(xml(addProperty(json('{}'), 'obj', item())), '//obj/Name[1]/text()'))
Есть ли какой-либо другой простой способ решить мою проблему. Заранее спасибо
Комментарии:
1. мы можем использовать contains в регулярном выражении, оно будет оценивать, существует ли ключ в объекте JSON или нет.
Ответ №1:
Для этой проблемы, похоже, вы получаете значение «Name» в цикле «Для каждого» из ответа «SQLServer GetRecords (V2)» напрямую. Мы можем просто использовать действие «Проанализировать JSON«, чтобы легко решить эту проблему. Пожалуйста, обратитесь к моему приложению logic ниже:
1. Я инициализирую переменную, хранящую те же данные json, что и ваши, чтобы имитировать ответ от «SQLServer GetRecords (V2)«.
2. Затем добавьте действие «Проанализировать JSON» для анализа jsondata. Мы можем нажать кнопку «Использовать образец полезной нагрузки для создания схемы» и скопировать в нее jsondata. Схема будет сгенерирована автоматически. Схема, показанная ниже (пожалуйста, обратите внимание: схема указывает, являются ли эти поля обязательными в required
свойстве).
{
"items": {
"properties": {
"@@odata.etag": {
"type": "string"
},
"ItemInternalId": {
"type": "string"
},
"Name": {
"type": "string"
},
"RowID": {
"type": "integer"
}
},
"required": [
"@@odata.etag",
"ItemInternalId",
"RowID"
],
"type": "object"
},
"type": "array"
}
3. Теперь используйте «Для каждого«, чтобы выполнить цикл body
из «Разбора JSON» и установите поле «Значение» со Name
свойством из «Разбора JSON«.
4. Запустите приложение logic, оно отлично работает без какого-либо сообщения об ошибке.
Комментарии:
1. parseJSON для меня действительно более простое решение, спасибо, что указали.
Ответ №2:
Если вы работаете с JSON:
item()?['Name']
Комментарии:
1. Это работает, только если значение item() равно null, это не сработает, если недоступно только поле ‘Name’
2. @shams. kool можете ли вы добавить свой код LogicApp? «элемент()? [‘Name’]» работает нормально для меня, когда «Name» недоступно в json
3. Это работает, когда у нас есть входные данные со схемой, например HTTP-запрос, не из источников, таких как SQL Server, добавление анализатора JSON со схемой кажется мне лучшим решением.
4. Как получить значение «Name», когда мы используем item()? [‘Name’]
5. «элемент()? [‘Name’]» у меня тоже сработало. Чтобы получить «Name», вам ничего не нужно, вы просто передаете «item()? [‘Name’]» и если там что-то есть, оно возвращается, в противном случае пустое. Спасибо, Джейсон
Ответ №3:
Если кто-то хочет проверить, существует ли свойство JSON, вы можете использовать условие с not
amp; empty
выражениями, подобными этому —
"expression": {
"not": [
{
"empty": [
"@JSONobject()?['keyName']"
]
}
]
},
...
..
.
Комментарии:
1. Как мы можем использовать это с другим условием?? например, я хочу проверить, есть ли Name или нет, и Name равно не «xyz»
Ответ №4:
… это похоже на старый, но все еще актуальный вопрос.
Что вы можете сделать, так это фактически использовать «настроить запуск после». Инициализируйте переменную типа Boolean, затем в следующем окне попробуйте присвоить переменной значение expression «not(empty(<ваше свойство здесь))». Это действие завершится неудачей, если свойство не существует. Итак, следуйте с другой «Установить переменную» в выражение «false». И в этом действии настройте запуск после, который будет выполняться, если предыдущее действие завершится неудачей. Если следующим элементом является «Проверить условие», ваша тестовая переменная будет false, если свойство не существовало или имело пустое значение.
Ответ №5:
Это довольно просто. Вы можете просто использовать функцию Null в приложении Logic: