Zasada JSONtoXML

Wyświetlasz dokumentację Apigee Edge.
Przejdź do dokumentacji Apigee X.
info

Co

Ta zasada konwertuje wiadomości z formatu JavaScript Object Notation (JSON) na język XML (Extensible Markup Language), dając Ci kilka opcji kontrolowania sposobu konwersji wiadomości.

Zasada jest szczególnie przydatna, jeśli chcesz przekształcać wiadomości za pomocą języka XSL. Po przekonwertowaniu ładunku JSON na XML użyj zasady XSL Transform z niestandardowym arkuszem stylów, aby przeprowadzić potrzebną transformację.

Zakładając, że celem jest przekonwertowanie żądania w formacie JSON na żądanie w formacie XML, zasada zostanie dołączona do przepływu żądania (np. Request / ProxyEndpoint / PostFlow).

Przykłady

Szczegółowe omówienie konwersji między formatami JSON i XML znajdziesz w artykule Problem z konwersją tablicy JSON na tablicę XML w obiekcie odpowiedzi.

Konwertowanie żądania

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

Ta konfiguracja przyjmuje komunikat żądania w formacie JSON jako źródło, a następnie tworzy komunikat w formacie XML, który jest wypełniany w zmiennej wyjściowej request. Edge automatycznie używa zawartości tej zmiennej jako komunikatu w następnym kroku przetwarzania.


Dokumentacja elementów

Poniżej znajdziesz elementy i atrybuty, które możesz skonfigurować w tej zasadzie.

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

Atrybuty <JSONToXML>

W tej tabeli opisano atrybuty wspólne dla wszystkich elementów nadrzędnych zasad:

Atrybut Opis Domyślny Obecność
name

Wewnętrzna nazwa zasady. Wartość atrybutu name może zawierać litery, cyfry, spacje, łączniki, podkreślenia i kropki. Ta wartość nie może przekracza 255 znaków.

Opcjonalnie możesz użyć elementu <DisplayName> do oznaczenia zasady jako edytor proxy interfejsu zarządzania z inną nazwą w języku naturalnym.

Nie dotyczy Wymagane
continueOnError

Ustaw jako false, aby w przypadku niepowodzenia zasady zwracany był błąd. To normalne w przypadku większości zasad.

Ustaw jako true, aby wykonywanie przepływu było kontynuowane nawet po zastosowaniu zasady niepowodzenie.

fałsz Opcjonalnie
enabled

Aby egzekwować zasadę, ustaw wartość true.

Aby wyłączyć zasadę, ustaw wartość false. Te zasady nie będą jest wymuszane nawet wtedy, gdy jest ono połączone z przepływem.

prawda Opcjonalnie
async

Ten atrybut został wycofany.

fałsz Wycofano

&lt;DisplayName&gt; element

Używaj oprócz atrybutu name do oznaczania zasady w edytor proxy interfejsu zarządzania z inną nazwą w języku naturalnym.

<DisplayName>Policy Display Name</DisplayName>
Domyślny

Nie dotyczy

Jeśli pominiesz ten element, atrybut name zasady otrzyma wartość .

Obecność Opcjonalnie
Typ Ciąg znaków

Element <Source>

Zmienna, żądanie lub odpowiedź, która zawiera komunikat JSON, który chcesz przekonwertować do XML.

Jeśli element <Source> nie jest zdefiniowany, jest traktowany jako komunikat (który jest rozpoznawany jako żądanie, gdy zasada jest dołączona do przepływu żądania, lub jako odpowiedź, gdy zasada jest dołączona do przepływu odpowiedzi).

Jeśli nie można rozpoznać zmiennej źródłowej lub jest ona rozpoznawana jako typ inny niż komunikat, zasada zgłasza błąd.

<Source>request</Source>
Domyślna żądanie lub odpowiedź, w zależności od tego, gdzie zasada jest dodawana do przepływu serwera proxy interfejsu API
Obecność Opcjonalny
Typ wiadomość

Element <OutputVariable>

Przechowuje wynik konwersji z formatu JSON na XML. Zwykle jest to ta sama wartość co źródło, czyli zwykle żądanie JSON jest konwertowane na żądanie XML.

Ładunek komunikatu JSON jest analizowany i konwertowany na XML, a nagłówek HTTP Content-type komunikatu w formacie XML jest ustawiany na text/xml;charset=UTF-8.

Jeśli element OutputVariable nie jest określony, source jest traktowany jako OutputVariable. Jeśli na przykład source to request, domyślna wartość OutputVariable to request.

<OutputVariable>request</OutputVariable>
Domyślna żądanie lub odpowiedź, w zależności od tego, gdzie zasada jest dodawana do przepływu serwera proxy interfejsu API
Obecność Ten element jest wymagany, gdy zmienna zdefiniowana w elemencie <Source> jest typu string.
Typ wiadomość

<Options>/<OmitXmlDeclaration>

Określa, czy przestrzeń nazw XML ma być pomijana w danych wyjściowych. Wartość domyślna to false co oznacza, że przestrzeń nazw jest uwzględniana w danych wyjściowych.

Na przykład to ustawienie konfiguruje zasadę tak, aby pomijała przestrzeń nazw:

<OmitXmlDeclaration>true</OmitXmlDeclaration>

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

Format JSON nie obsługuje przestrzeni nazw, natomiast dokumenty XML często ich wymagają. NamespaceBlockName umożliwia zdefiniowanie właściwości JSON, która będzie służyć jako źródło definicji przestrzeni nazw w pliku XML wygenerowanym przez zasadę. (Oznacza to, że źródłowy plik JSON musi zawierać właściwość, którą można zmapować na przestrzeń nazw oczekiwaną przez aplikację, która korzysta z wynikowego pliku XML).

Na przykład te ustawienia:

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

wskazują, że w źródłowym pliku JSON istnieje właściwość o nazwie #namespaces, która zawiera co najmniej 1 przestrzeń nazw oznaczoną jako domyślną. Na przykład:

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

jest konwertowane na:

<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> określa nazwę elementu głównego podczas konwersji z formatu JSON, który nie ma nazwanego elementu głównego na format XML.

Jeśli na przykład plik JSON wygląda tak:

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

A Ty ustawisz <ObjectRootElementName> jako:

<ObjectRootElementName>Root</ObjectRootElementName>

Wynikowy plik XML będzie wyglądać tak:

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

<Options>/<AttributeBlockName>
<Options>/<AttributePrefix> elements

<AttributeBlockName> umożliwia określenie, kiedy elementy JSON są konwertowane na atrybuty XML (a nie na elementy XML).

Na przykład to ustawienie konwertuje właściwości w obiekcie o nazwie #attrs na atrybuty XML:

<AttributeBlockName>#attrs</AttributeBlockName>

Ten obiekt JSON:

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

jest konwertowany na tę strukturę XML:

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

<AttributePrefix> konwertuje właściwość zaczynającą się od określonego prefiksu na atrybuty XML. Jeśli prefiks atrybutu jest ustawiony na @, na przykład:

<AttributePrefix>@</AttributePrefix>

Konwertuje ten obiekt JSON:

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

 }
}

na tę strukturę XML:

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

<Options>/<ArrayRootElementName>
<Options>/<ArrayItemElementName> element

Konwertuje tablicę JSON na listę elementów XML o określonych nazwach elementu nadrzędnego i podrzędnego.

Na przykład te ustawienia:

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

konwertują tę tablicę JSON:

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

na tę strukturę XML:

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

<Options>/<Indent>

Określa, czy dane wyjściowe XML mają być wcięte. Wartość domyślna to false , co oznacza, że wcięcia nie są stosowane.

Na przykład to ustawienie konfiguruje zasadę tak, aby wcięcia były stosowane w danych wyjściowych:

<Indent>true</Indent>

Jeśli dane wejściowe JSON mają postać:

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

Dane wyjściowe bez wcięć wyglądają tak:

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

Gdy wcięcia są włączone, dane wyjściowe wyglądają tak:

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

<Options>/<TextNodeName> element

Konwertuje właściwość JSON na węzeł tekstowy XML o określonej nazwie. Na przykład to ustawienie:

<TextNodeName>age</TextNodeName>

konwertuje ten plik JSON:

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

na tę strukturę XML:

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

Jeśli element TextNodeName nie jest określony, plik XML jest generowany przy użyciu domyślnego ustawienia węzła tekstowego:

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

<Options>/<NullValue> element

Wskazuje wartość null. Domyślnie wartość to NULL.

Na przykład to ustawienie:

<NullValue>I_AM_NULL</NullValue>
Konwertuje ten obiekt JSON:
{"person" : "I_AM_NULL"}

na ten element XML:

<person></person>

Jeśli dla wartości null nie określono żadnej wartości (lub określono wartość inną niż I_AM_NULL), ten sam ładunek jest konwertowany na:

<person>I_AM_NULL</person>

<Options>/<InvalidCharsReplacement> element

Aby ułatwić obsługę nieprawidłowego kodu XML, który może powodować problemy z analizatorem, to ustawienie zastępuje wszystkie elementy JSON, które generują nieprawidłowy kod XML, ciągiem znaków. Na przykład to ustawienie:

<InvalidCharsReplacement>_</InvalidCharsReplacement>

Konwertuje ten obiekt JSON

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

na tę strukturę XML:

<First_Name>John<First_Name>

Zastosowanie

W typowym scenariuszu mediacji zasada JSON to XML w przepływie żądania przychodzącego jest często łączona z zasadą XMLtoJSON w przepływie odpowiedzi wychodzącej. Dzięki takiemu połączeniu zasad można udostępnić interfejs API JSON dla usług, które natywnie obsługują tylko format XML.

Często przydatne jest zastosowanie domyślnej (pustej) zasady JSON to XML i stopniowe dodawanie elementów konfiguracji w razie potrzeby.

W scenariuszach, w których interfejsy API są używane przez różne aplikacje klienckie, które mogą wymagać formatu JSON lub XML, format odpowiedzi można ustawić dynamicznie, konfigurując zasady JSON to XML i XML to JSON tak, aby były wykonywane warunkowo. Implementację tego scenariusza znajdziesz w artykule Zmienne przepływu i warunki.

Schematy

Dokumentacja błędów

This section describes the fault codes and error messages that are returned and fault variables that are set by Edge when this policy triggers an error. This information is important to know if you are developing fault rules to handle faults. To learn more, see What you need to know about policy errors and Handling faults.

Runtime errors

These errors can occur when the policy executes.

Fault code HTTP status Cause Fix
steps.jsontoxml.ExecutionFailed 500 The input payload (JSON) is empty or the input (JSON) passed to JSON to XML policy is invalid or malformed.
steps.jsontoxml.InCompatibleTypes 500 This error occurs if the type of the variable defined in the <Source> element and the <OutputVariable> element are not the same. It is mandatory that the type of the variables contained within the <Source> element and the <OutputVariable> element matches. The valid types are message and string.
steps.jsontoxml.InvalidSourceType 500 This error occurs if the type of the variable used to define the <Source> element is invalid. The valid types of variable are message and string.
steps.jsontoxml.OutputVariableIsNotAvailable 500 This error occurs if the variable specified in the <Source> element of the JSON to XML Policy is of type string and the <OutputVariable> element is not defined. The <OutputVariable> element is mandatory when the variable defined in the <Source> element is of type string.
steps.jsontoxml.SourceUnavailable 500 This error occurs if the message variable specified in the <Source> element of the JSON to XML policy is either:
  • out of scope (not available in the specific flow where the policy is being executed) or
  • can't be resolved (is not defined)

Deployment errors

None.

Fault variables

These variables are set when a runtime error occurs. For more information, see What you need to know about policy errors.

Variables Where Example
fault.name="fault_name" fault_name is the name of the fault, as listed in the Runtime errors table above. The fault name is the last part of the fault code. fault.name Matches "SourceUnavailable"
jsontoxml.policy_name.failed policy_name is the user-specified name of the policy that threw the fault. jsontoxml.JSON-to-XML-1.failed = true

Example error response

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

Example fault rule

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

Powiązane artykuły