Приложение Azure Logic: проверка наличия свойства в объекте json

#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:

смотрите скриншот