как гарантировать, что квадратные скобки [ ] окружают содержимое узла?

#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. Опять же, это то, что нужно сделать, если вы не можете изменить способ возврата данных к вам.