Правило JSONtoXML

Вы просматриваете документацию по Apigee Edge.
Перейдите к документации по Apigee X.
Информация

Что

Это правило преобразует письма из формата JSON (JavaScript Object Notation) в формат XML (extensible markup language). При этом у вас будет несколько вариантов управления процессом преобразования.

Правило особенно полезно, если вы хотите преобразовать письма с помощью XSL. После преобразования полезной нагрузки JSON в XML используйте правило преобразования XSL с пользовательской таблицей стилей, чтобы выполнить необходимое преобразование.

Если вы хотите преобразовать запрос в формате JSON в запрос в формате XML, правило нужно прикрепить к потоку запроса (например, Request / ProxyEndpoint / PostFlow).

Примеры

Подробную информацию о преобразовании JSON в XML можно найти в статье Проблема с преобразованием массива JSON в массив XML в объекте ответа.

Как преобразовать запрос

<JSONToXML name="jsontoxml">
    <Source>request</Source>
    <OutputVariable>request</OutputVariable>
</JSONToXML>

Эта конфигурация принимает сообщение запроса в формате JSON в качестве источника, а затем создает сообщение в формате XML, которое заполняется в переменной request. Edge автоматически использует содержимое этой переменной в качестве сообщения для следующего этапа обработки.


Сведения об элементах

Ниже перечислены элементы и атрибуты, которые можно настроить в этом правиле.

<JSONToXML async="false" continueOnError="false" enabled="true" name="JSON-to-XML-1">
    <DisplayName>JSON to XML 1</DisplayName>
    <Source>request</Source>
    <OutputVariable>request</OutputVariable>
    <Options>
        <OmitXmlDeclaration>false</OmitXmlDeclaration>
        <DefaultNamespaceNodeName>$default</DefaultNamespaceNodeName>
        <NamespaceSeparator>:</NamespaceSeparator>
        <AttributeBlockName>#attrs</AttributeBlockName>
        <AttributePrefix>@</AttributePrefix>
        <ObjectRootElementName>Root</ObjectRootElementName>
        <ArrayRootElementName>Array</ArrayRootElementName>
        <ArrayItemElementName>Item</ArrayItemElementName>
        <Indent>false</Indent>
        <TextNodeName>#text</TextNodeName>
        <NullValue>I_AM_NULL</NullValue>
        <InvalidCharsReplacement>_</InvalidCharsReplacement>
    </Options>
</JSONToXML>

Атрибуты <JSONToXML>

В следующей таблице описаны атрибуты, общие для всех родительских элементов политики:

Атрибут Описание По умолчанию Присутствие
name

Внутреннее имя политики. Значение атрибута name может содержать буквы, цифры, пробелы, дефисы, подчеркивания и точки. Это значение не может превышать 255 символов.

При необходимости используйте элемент <DisplayName> , чтобы пометить политику в редакторе прокси-сервера пользовательского интерфейса управления другим именем на естественном языке.

Н/Д Необходимый
continueOnError

Установите значение false , чтобы возвращать ошибку в случае сбоя политики. Это ожидаемое поведение для большинства политик.

Установите значение true , чтобы выполнение потока продолжалось даже после сбоя политики.

ЛОЖЬ Необязательный
enabled

Установите значение true , чтобы обеспечить соблюдение политики.

Установите значение false , чтобы отключить политику. Политика не будет применена, даже если она останется привязанной к потоку.

истинный Необязательный
async

Этот атрибут устарел.

ЛОЖЬ Устарело

Элемент <DisplayName>

Используйте в дополнение к атрибуту name , чтобы пометить политику в редакторе прокси-сервера пользовательского интерфейса управления другим именем на естественном языке.

<DisplayName>Policy Display Name</DisplayName>
По умолчанию

Н/Д

Если вы опустите этот элемент, будет использовано значение атрибута name политики.

Присутствие Необязательный
Тип Нить

Элемент <Source>

Переменная, запрос или ответ, содержащие сообщение JSON, которое нужно преобразовать в XML.

Если <Source> не определено, оно обрабатывается как сообщение (которое преобразуется в запрос, если правило прикреплено к потоку запросов, или в ответ, если правило прикреплено к потоку ответов).

Если исходную переменную не удается разрешить или она разрешается в тип, отличный от типа сообщения, правило выдает ошибку.

<Source>request</Source>
По умолчанию запрос или ответ (в зависимости от того, в какой части потока прокси-сервера API добавлено правило).
Присутствие Необязательно
Тип Сообщение

Элемент <OutputVariable>

Сохраняет выходные данные преобразования из формата JSON в XML. Обычно это то же значение, что и у источника, то есть запрос JSON преобразуется в запрос XML.

Полезная нагрузка сообщения JSON анализируется и преобразуется в XML, а для заголовка HTTP Content-type сообщения в формате XML задается значение text/xml;charset=UTF-8.

Если OutputVariable не указано, source считается OutputVariable. Например, если для параметра source задано значение request, то по умолчанию для параметра OutputVariable будет установлено значение request.

<OutputVariable>request</OutputVariable>
По умолчанию запрос или ответ (в зависимости от того, в какой части потока прокси-сервера API добавлено правило).
Присутствие Этот элемент обязателен, если переменная, определенная в элементе <Source>, имеет тип string.
Тип Сообщение

<Options>/<OmitXmlDeclaration>

Указывает, что пространство имен XML должно быть исключено из выходных данных. Значение по умолчанию – false, то есть пространство имен будет включено в выходные данные.

Например, следующая настройка позволяет исключить пространство имен из политики:

<OmitXmlDeclaration>true</OmitXmlDeclaration>

<Options>/<NamespaceBlockName>
<Options>/<DefaultNamespaceNodeName>
<Options>/<NamespaceSeparator>

JSON не поддерживает пространства имен, а XML-документы часто требуют их. NamespaceBlockName позволяет определить свойство JSON, которое будет источником определения пространства имен в XML, созданном правилом. (Это означает, что в исходном файле JSON должен быть ресурс, который можно сопоставить с пространством имен, ожидаемым приложением, использующим полученный XML-файл.)

Например, следующие настройки:

<NamespaceBlockName>#namespaces</NamespaceBlockName>
<DefaultNamespaceNodeName>$default</DefaultNamespaceNodeName>
<NamespaceSeparator>:</NamespaceSeparator>

указывает, что в исходном файле JSON есть свойство #namespaces, которое содержит хотя бы одно пространство имен, назначенное по умолчанию. Пример:

{
   "population": {
       "#namespaces": {
           "$default": "http://www.w3.org/1999/people",
           "exp": "http://www.w3.org/1999/explorers"
       },
       "person": "John Smith",
       "exp:person": "Pedro Cabral"
   }
}

будет преобразовано в:

<population xmlns="http://www.w3.org/1999/people" xmlns:exp="http://www.w3.org/1999/explorers">
  <person>John Smith</person>
  <exp:person>Pedro Cabral</exp:person>
</population>

<Options>/<ObjectRootElementName>

<ObjectRootElementName> указывает название корневого элемента при преобразовании из JSON, в котором нет корневого элемента с названием, в XML.

Например, если JSON выглядит так:

{
  "abc": "123",
  "efg": "234"
}

Вы задали для элемента <ObjectRootElementName> следующее значение:

<ObjectRootElementName>Root</ObjectRootElementName>

Полученный XML-код выглядит следующим образом:

<Root>
   <abc>123</abc>
   <efg>234</efg>
</Root>

Элементы <Options>/<AttributeBlockName>
<Options>/<AttributePrefix>

<AttributeBlockName> позволяет указать, когда элементы JSON должны преобразовываться в атрибуты XML (а не в элементы XML).

Например, следующая настройка преобразует свойства объекта #attrs в атрибуты XML:

<AttributeBlockName>#attrs</AttributeBlockName>

Следующий объект JSON:

{
    "person" : {
        "#attrs" : {
            "firstName" : "John",
            "lastName" : "Smith"
        },
        "occupation" : "explorer",
    }
}

преобразуется в следующую структуру XML:

<person firstName="John" lastName="Smith">
  <occupation>explorer</occupation>
</person>

<AttributePrefix> преобразует свойство, начинающееся с указанного префикса, в атрибуты XML. Если префикс атрибута задан как @, например:

<AttributePrefix>@</AttributePrefix>

Преобразует следующий объект JSON:

{
"person" : {
   "@firstName" : "John",
   "@lastName" : "Smith"
   "occupation" : "explorer",

 }
}

в следующую структуру XML:

<person firstName="John" lastName="Smith">
  <occupation>explorer</occupation>
</person>

Элемент <Options>/<ArrayRootElementName>
<Options>/<ArrayItemElementName>

Преобразует массив JSON в список элементов XML с указанными названиями родительских и дочерних элементов.

Например, следующие настройки:

<ArrayRootElementName>Array</ArrayRootElementName>
<ArrayItemElementName>Item</ArrayItemElementName>

преобразует следующий массив JSON:

[
"John Cabot",
{
 "explorer": "Pedro Cabral"
},
"John Smith"
]

в следующую структуру XML:

<Array>
  <Item>John Cabot</Item>
  <Item>
    <explorer>Pedro Cabral</explorer>
  </Item>
  <Item>John Smith</Item>
</Array>

<Options>/<Indent>

Указывает, что выходные данные XML должны быть отформатированы с отступами. Значение по умолчанию – false (без отступа).

Например, следующая настройка задает отступ в выходных данных:

<Indent>true</Indent>

Если входные данные JSON имеют следующий вид:

{"n": [1, 2, 3] }

Тогда результат без отступов будет выглядеть так:

<Array><n>1</n><n>2</n><n>3</n></Array>

Если включить отступы, результат будет выглядеть так:

  <Array>
    <n>1</n>
    <n>2</n>
    <n>3</n>
  </Array>

Элемент <Options>/<TextNodeName>

Преобразует свойство JSON в текстовый узел XML с указанным именем. Например, если задана следующая настройка:

<TextNodeName>age</TextNodeName>

преобразует следующий код JSON:

{
    "person": {
        "firstName": "John",
        "lastName": "Smith",
        "age": 25
    }
}

в следующую структуру XML:

<person>
  <firstName>John</firstName>25<lastName>Smith</lastName>
</person>

Если TextNodeName не указан, XML-код создается с использованием настройки по умолчанию для текстового узла:

<person>
  <firstName>John</firstName>
  <age>25</age>
  <lastName>Smith</lastName>
</person>

Элемент <Options>/<NullValue>

Указывает на нулевое значение. По умолчанию задано значение NULL.

Например, можно задать следующие настройки:

<NullValue>I_AM_NULL</NullValue>
Преобразует следующий объект JSON:
{"person" : "I_AM_NULL"}

следующему XML-элементу:

<person></person>

Если для нулевого значения не указано значение (или указано значение, отличное от I_AM_NULL), то та же полезная нагрузка преобразуется в:

<person>I_AM_NULL</person>

Элемент <Options>/<InvalidCharsReplacement>

Чтобы помочь с обработкой недопустимого XML-кода, который может вызвать проблемы с синтаксическим анализатором, этот параметр заменяет любые элементы JSON, которые создают недопустимый XML-код, на строку. Например, можно задать следующие настройки:

<InvalidCharsReplacement>_</InvalidCharsReplacement>

Преобразует этот объект JSON

{
    "First%%%Name": "John"
}

в следующую структуру XML:

<First_Name>John<First_Name>

Примечания

В типичном сценарии медиации правило JSON в XML для входящего запроса часто сочетается с правилом XML в JSON для исходящего ответа. Таким образом можно объединить правила и создать JSON API для сервисов, которые изначально поддерживают только XML.

Часто бывает полезно применить к правилу JSON для XML пустой JSON по умолчанию и итеративно добавлять элементы конфигурации по мере необходимости.

Если API используются разными клиентскими приложениями, которым могут требоваться форматы JSON и XML, формат ответа можно задать динамически, настроив правила преобразования JSON в XML и XML в JSON для условного выполнения. Пример реализации этого сценария можно найти в разделе Переменные и условия.

Схемы

Справочник по ошибкам

В этом разделе описаны коды ошибок и сообщения об ошибках, которые возвращаются, а также переменные ошибок, которые задаются Edge, когда это правило вызывает ошибку. Эта информация важна, если вы разрабатываете правила обработки ошибок. Подробнее о том, что нужно знать об ошибках в правилах и об обработке ошибок…

Ошибки времени выполнения

Эти ошибки могут возникать при выполнении правил.

Код ошибки Статус HTTP Причина Исправить
steps.jsontoxml.ExecutionFailed 500 Входные данные (JSON), переданные в правило JSON в XML, пусты или имеют недействительный или неверный формат.
steps.jsontoxml.InCompatibleTypes 500 Эта ошибка возникает, если тип переменной, определенной в элементе <Source>, не совпадает с типом переменной, определенной в элементе <OutputVariable>. Типы переменных, содержащихся в элементах <Source> и <OutputVariable>, должны совпадать. Допустимые типы: message и string.
steps.jsontoxml.InvalidSourceType 500 Эта ошибка возникает, если тип переменной, используемой для определения элемента <Source>, недопустим. Допустимые типы переменных: message и string.
steps.jsontoxml.OutputVariableIsNotAvailable 500 Эта ошибка возникает, если переменная, указанная в элементе <Source> правила JSON в XML, имеет тип string, а элемент <OutputVariable> не определен. Элемент <OutputVariable> обязателен, если переменная, определенная в элементе <Source>, имеет тип string (строка).
steps.jsontoxml.SourceUnavailable 500 Эта ошибка возникает, если переменная message, указанная в элементе <Source> правила JSON в XML, имеет одно из следующих значений:
  • недоступно (не поддерживается в определенном процессе, в котором выполняется правило);
  • не может быть разрешен (не определен);

Ошибки развертывания

Нет.

Переменные ошибок

Эти переменные задаются при возникновении ошибки выполнения. Подробнее о нарушениях правил…

Переменные Место Пример
fault.name="fault_name" fault_name – название ошибки, указанное в таблице Ошибки выполнения выше. Название ошибки – это последняя часть кода ошибки. fault.name Matches "SourceUnavailable"
jsontoxml.policy_name.failed policy_name – заданное пользователем название правила, которое вызвало ошибку. jsontoxml.JSON-to-XML-1.failed = true

Пример ответа об ошибке

{
  "fault": {
    "faultstring": "JSONToXML[JSON-to-XML-1]: Source xyz is not available",
    "detail": {
      "errorcode": "steps.json2xml.SourceUnavailable"
    }
  }
}

Пример правила обработки ошибок

<FaultRule name="JSON To XML Faults">
    <Step>
        <Name>AM-SourceUnavailableMessage</Name>
        <Condition>(fault.name Matches "SourceUnavailable") </Condition>
    </Step>
    <Step>
        <Name>AM-BadJSON</Name>
        <Condition>(fault.name = "ExecutionFailed")</Condition>
    </Step>
    <Condition>(jsontoxml.JSON-to-XML-1.failed = true) </Condition>
</FaultRule>

Статьи по теме