#json #xml #xslt #biztalk #azure-logic-apps
#json #xml #xslt #biztalk #azure-logic-apps
Вопрос:
Как вы гарантируете, что преобразование для определенного поля всегда будет находиться внутри массива?
Моя карта преобразует полезную нагрузку XML в другую полезную нагрузку XML.
Field1 --> use
Field2 --> system
Field3 --> value
Вот схема «правой» стороны, с identifier
в качестве родительского узла:
После преобразования результат XML будет:
<ns0:identifier>
<ns0:use>a</ns0:use>
<ns0:system>b</ns0:system>
<ns0:value>c</ns0:value>
</ns0:identifier>
Если я преобразую это в json:
{
identifier: {"use":"a", "system":"b", "value":"c"}
}
Однако результат, который мне нужен, заключается в том, чтобы содержимое identifier
было заключено внутри массива, []
:
{
identifier: [{"use":"a", "system":"b", "value":"c"}]
}
Как мне гарантировать, что эта полезная нагрузка всегда будет находиться внутри массива?
Для этого ресурса:
Я пробовал это решение; однако изменение min / max на 1, похоже, не имело никакого значения в выходных данных:
Комментарии:
1. Как сказал Джонс в комментариях под своим ответом. Какую версию BizTalk вы используете?
Ответ №1:
Для BizTalk Server 2013 R2 и выше:
Установите значение Max, равное * (Неограниченное)
Для BizTalk Server 2013 и ниже с использованием JSON.Сеть в компоненте конвейера:
Вы должны добавить атрибут json:Array к элементу в Xml-схеме, чтобы сериализатор JSON всегда обрабатывал объект как массив.
Единственное значение true: json:Array=’true’
Подробности здесь: Преобразуйте XML в JSON и принудительно используйте массив
Комментарии:
1. большое спасибо, я попытался сделать это здесь: freeformatter.com/xml-to-json-converter.html со следующей полезной нагрузкой:
<root> <identifier json:Array='true'> <use>usual</use> <system>codes</system> <value>AppointmentID_0</value> </identifier> </root>
но получил это сообщение:Unable to parse any XML input. The prefix "json" for attribute "json:Array" associated with an element type "identifier" is not bound.
2. О, схема, позвольте мне попробовать это
3. @l—«»»———«»»»»» Вопрос помечен как BizTalk, поэтому этот ответ предназначен для BizTalk. Я понятия не имею, что такое freeformatter или как это работает. Они могут иметь разные обозначения.
4.
namespace prefix json is not defined
5. @l—«»»———«»»»»» Подождите, какую версию BizTalk вы используете? Это изменилось с 2013 по 2016 год.
Ответ №2:
Если вы не можете контролировать, как происходит преобразование XML, вам просто нужно проверить, является ли значение уже массивом или нет, и изменить его, если это не массив.
Допустим, вы получаете свой результат обратно в переменной с именем res
.
res = {identifier: {"use":"a", "system":"b", "value":"c"}};
Затем вы можете использовать подобный код, чтобы убедиться, что это то, что вы хотите:
let res = {
identifier: {
"use": "a",
"system": "b",
"value":"c"
}
};
console.log(res);
console.log('---------------------------');
if(!Array.isArray(res.identifier)) {
res.identifier = [res.identifier];
}
console.log(res);
Комментарии:
1. вместо того, чтобы изменять результат преобразования, я хотел бы иметь возможность декларативно указывать это поведение
2. Опять же, это то, что нужно сделать, если вы не можете изменить способ возврата данных к вам.