У меня довольно легко выбрать базу данных SQL Azure, которая возвращает 2 строки с 2 атрибутами. На выходе это выглядит так:
{
"resultSetCount": 1,
"recordsAffected": 0,
"resultSets": [
{
"rowCount": 2,
"rows": [
{
"Name": "Adam",
"Surname": "Black"
},
{
"Name": "Richard",
"Surname": "Nolan"
}
]
}
],
И я хочу установить переменную, чтобы получить значение {"Name":["Adam","Richard"]}
, но я вообще не могу этого добиться.
@activity('Script1').output.resultSets[0].rows[0].Name
- работает не так, как я ожидал
Какой-нибудь совет, пожалуйста?
Для достижения вашего требования вам необходимо использовать комбинацию действия For-each и действия добавления переменной.
Сначала создайте переменную массива без значений в разделе переменных конвейера. Здесь я создал две переменные массива, где вторая переменная предназначена только для отображения результата и не требуется.
Возьмите действие for-each и передайте ему массив rows
@activity('Script1').output.resultSets[0].rows
из действия Script и установите здесь флажок Sequential, поскольку он сохраняет порядок массива.
Внутри for-each выполните действие добавления переменной и выберите переменную массива, созданную ранее. Придайте ему выражение @item().Name
. Он добавляет значение Name
к созданному массиву на каждой итерации.
В конце for-each массив результатов будет сохранен в массиве mynames
, и вы сможете использовать его в дальнейших действиях в соответствии с вашими требованиями. Чтобы просто показать результат, я присвоил эту переменную массива другой переменной массива res_display
в действии установки переменной после действия for-each.
Отладьте конвейер, и вы получите ожидаемый массив:
Если вы хотите передать его как строку, вам не нужно беспокоиться о символе \, поскольку это escape-символ для "
. Он не будет передан в функцию. В функцию будет передана только необходимая строка.
@MartinKonecny Хорошо принять решение, если оно решило проблему. Это во благо сообщества SO, смотрите SO Ссылка
Я вижу, ок, это хорошо. И если ожидаемым json для моей функции является вызов тела {"Name": ["Rakesh","John"]}, но я вижу на входе "{"Name": ["Rakesh","John"]}" . Могу ли я удалить «с начала и с конца. Или я тоже могу это игнорировать?»
Если вы хотите передать его как строку, вы можете это сделать. Если это должен быть JSON, вы можете удалить их или использовать функцию @json(concat('{"Name":',string(variables(<your_variable_name>)),'}'))
для переноса строки JSON. Эта функция преобразует строку JSON в объект JSON.
Я получаю сообщение об ошибке: «Переменная «OutputJSON» типа «String» не может быть инициализирована или обновлена значением типа «Object». Переменная «OutputJSON» поддерживает только значения типов «String». и я использовал @json(concat('{"Name":',string(variables('Name')),'}')). Если я правильно понимаю, ввод представляет собой массив со строкой (переменные (<имя_вашей_переменной>)) я преобразую его в строку JSON, затем объединяю его с помощью '{"Name":' a с @json при запросе, я должен получить результат { "Имя": ["Ракеш","Джон"]} без " " Правильно ли, что переменная определяется как строка? или где я ошибся? Спасибо
Затем передайте массив как строку, что означает удаление функции @json(). В вашей функции преобразуйте эту строку JSON в обычный JSON.
Большое спасибо за подробную инструкцию - все работает именно так, как я хочу. И у меня есть дополнительный вопрос, если можно. Я хочу использовать эту переменную для функции Azure (python) в качестве входных данных для тела, например: "{"Name": ["Rakesh","John"]}" Я установил переменную @concat('"{"Name":' ,variables('mynames'), '}"'), но на выходе получается ""{"Name":["Rakesh","John"]}"" и я не могу избавиться от \ символов. Большое спасибо