Zasada JSONtoXML

Przeglądasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X.
Informacje

Co

Ta zasada konwertuje wiadomości z formatu JavaScript Object Notation (JSON) na rozszerzalny język znaczników (XML), dzięki czemu masz kilka opcji kontrolowania sposobu konwertowania wiadomości.

Ta zasada jest szczególnie przydatna, jeśli chcesz przekształcać wiadomości w formacie XSL. Po przekonwertowaniu ładunku JSON na format XML użyj zasady przekształcania XSL z niestandardowym arkuszem stylów, aby wykonać odpowiednie przekształcenie.

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

Sample

Szczegółowe omówienie konwertowania między formatami JSON i XML znajdziesz na http://community.apigee.com/articles/1839/converting-between-xml-and-json-what-you-need-to-k.html.

Konwertowanie żądania

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

Ta konfiguracja pobiera wiadomość żądania w formacie JSON jako źródło, a następnie tworzy wiadomość w formacie XML, którą wypełnia zmienna wyjściowa request. Edge automatycznie używa zawartości tej zmiennej jako komunikatu w następnym kroku przetwarzania.


Odwołanie do elementu

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>

Tabela poniżej zawiera opis atrybutów wspólnych dla wszystkich elementów nadrzędnych zasad:

Atrybut Opis Domyślne 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>, aby oznaczyć zasadę w edytorze serwera proxy interfejsu zarządzania inną nazwą w języku naturalnym.

Nie dotyczy Wymagane
continueOnError

Ustaw wartość false, aby zwracać błąd w przypadku niepowodzenia zasady. Jest to normalne działanie większości zasad.

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

false Opcjonalnie
enabled

Ustaw jako true, aby wymuszać zasadę.

Ustaw wartość false, aby wyłączyć tę zasadę. Zasada nie będzie egzekwowana, nawet jeśli pozostanie dołączona do procesu.

prawda Opcjonalnie
async

Ten atrybut został wycofany.

false Wycofano

Element <DisplayName>

Użyj oprócz atrybutu name, aby oznaczyć zasadę w edytorze serwera proxy interfejsu zarządzania inną nazwą w języku naturalnym.

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

Nie dotyczy

Jeśli pominiesz ten element, zostanie użyta wartość atrybutu name zasady.

Obecność Opcjonalnie
Typ Ciąg znaków

Element <Source>

Zmienna, żądanie lub odpowiedź zawierające wiadomość w formacie JSON, którą chcesz przekonwertować na format XML.

Jeśli zasada <Source> nie jest zdefiniowana, jest traktowana jako wiadomość (która przechodzi do żądania, gdy zasada jest dołączona do przepływu żądań lub jako odpowiedź, gdy zasada jest dołączona do procesu odpowiedzi).

Jeśli nie można znaleźć zmiennej źródłowej lub przyjmuje ona typ inny niż wiadomość, zasada zgłasza błąd.

<Source>request</Source>
Domyślnie żądanie lub odpowiedź, zależnie od tego, gdzie zasada zostanie dodana do procesu serwera proxy interfejsu API
Obecność Opcjonalnie
Typ wiadomość

Element <outputVariable>

Przechowuje dane wyjściowe konwersji w formacie JSON na XML. Zwykle jest to wartość taka sama jak wartość źródła, czyli zwykle żądanie JSON jest konwertowane na żądanie XML.

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

Jeśli OutputVariable nie jest określony, source jest traktowany jako OutputVariable. Jeśli np. source to request, OutputVariable przyjmuje wartość domyślną request.

<OutputVariable>request</OutputVariable>
Domyślnie żądanie lub odpowiedź, zależnie od tego, gdzie zasada zostanie dodana do procesu serwera proxy interfejsu API
Obecność Ten element jest wymagany, gdy zmienna zdefiniowana w elemencie <Source> jest ciągiem znaków.
Typ wiadomość

<Opcje>/<OmitXmlDeklaracja>

Określa pomijanie przestrzeni nazw XML w danych wyjściowych. Wartość domyślna to false, co oznacza, że w danych wyjściowych trzeba uwzględnić przestrzeń nazw.

Na przykład to ustawienie konfiguruje zasadę pomijania przestrzeni nazw:

<OmitXmlDeclaration>true</OmitXmlDeclaration>

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

Pliki JSON nie obsługują przestrzeni nazw, a dokumenty XML często ich wymagają. NamespaceBlockName umożliwia zdefiniowanie właściwości JSON, która 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, która jest oczekiwana przez aplikację korzystającą z utworzonego kodu XML.

Mogą to być na przykład te ustawienia:

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

wskazuje, że w źródłowym pliku JSON istnieje właściwość o nazwie #namespaces, która zawiera co najmniej 1 przestrzeń nazw wyznaczoną 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"
   }
}

konwertuje 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 dla elementu <ObjectRootElementName> ustaw:

<ObjectRootElementName>Root</ObjectRootElementName>

Wynikowy kod XML wygląda tak:

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

<Opcje>/<AttributeBlockName>
Elementy <Options>/<AttributePrefix>

<AttributeBlockName> pozwala określić, kiedy elementy JSON mają być konwertowane na atrybuty XML (a nie na elementy XML).

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

<AttributeBlockName>#attrs</AttributeBlockName>

Ten obiekt JSON:

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

jest konwertowany na następującą strukturę XML:

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

<AttributePrefix> konwertuje właściwość, której nazwa zaczyna się od określonego prefiksu, na atrybuty XML. Gdy prefiks atrybutu jest ustawiony na @, na przykład:

<AttributePrefix>@</AttributePrefix>

Konwertuje następujący obiekt JSON:

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

 }
}

do następującej struktury XML:

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

<Options>/<SlateRootElementName>
<Opcje>/<Element_tablicy_elementu>

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

Mogą to być na przykład te ustawienia:

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

konwertuje tę tablicę JSON:

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

w następującą strukturę XML:

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

<Opcje>/<Wcięcie>

Określa wcięcie danych wyjściowych XML. Wartość domyślna to false, co oznacza, że nie należy dodawać wcięcia.

Na przykład to ustawienie konfiguruje wcięcie 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>

Po włączeniu wcięć dane wyjściowe są takie:

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

Element <Options>/<TextNodeName>

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

do tej struktury XML:

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

Jeśli TextNodeName nie zostanie określony, kod XML zostanie wygenerowany przy użyciu ustawienia domyślnego dla węzła tekstowego:

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

Element <Options>/<NullValue>

Wskazuje wartość null. Wartość domyślna to NULL.

Na przykład to ustawienie:

<NullValue>I_AM_NULL</NullValue>
Konwertuje następujący obiekt JSON:
{"person" : "I_AM_NULL"}

do tego elementu XML:

<person></person>

Jeśli dla wartości null nie określono żadnej wartości (lub wartości innej niż I_AM_NULL), ten sam ładunek zostanie przekonwertowany na:

<person>I_AM_NULL</person>

Element <Options>/<InvalidCharsReplacement>

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

<InvalidCharsReplacement>_</InvalidCharsReplacement>

Konwertuje ten obiekt JSON

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

do tej struktury XML:

<First_Name>John<First_Name>

Zastosowanie

W typowym scenariuszu zapośredniczenia zasady JSON-XML dotyczące przepływu żądań przychodzących są często łączone z zasadą XMLtoJSON na potrzeby przepływu odpowiedzi wychodzących. Dzięki połączeniu zasad w ten sposób interfejs JSON API może zostać ujawniony w przypadku usług, które natywnie obsługują tylko kod XML.

Często przydaje się zastosowanie domyślnego (pustego) pliku JSON do zasady XML i iteracyjnie dodawanie elementów konfiguracji zgodnie z wymaganiami.

W sytuacjach, gdy interfejsy API są używane przez różne aplikacje klienckie, które mogą wymagać formatu JSON i XML, format odpowiedzi można ustawić dynamicznie, konfigurując format JSON jako XML i XML, aby warunkowo wykonywać zasady JSON. Implementację tego scenariusza znajdziesz w sekcji Zmienne i warunki przepływu.

Schematy

Informacje o błędach

W tej sekcji opisujemy kody błędów i komunikaty o błędach, które są zwracane, oraz zmienne błędów ustawiane przez Edge, gdy ta zasada wywołuje błąd. Te informacje są ważne, jeśli opracowujesz reguły dotyczące błędów do obsługi takich błędów. Więcej informacji znajdziesz w sekcjach Co musisz wiedzieć o błędach zasad i Postępowanie w przypadku błędów.

Błędy w czasie wykonywania

Te błędy mogą wystąpić podczas wykonywania zasady.

Kod błędu Stan HTTP Przyczyna Napraw
steps.jsontoxml.ExecutionFailed 500 Ładunek wejściowy (JSON) jest pusty lub dane wejściowe (JSON) przekazane do zasady JSON do XML są nieprawidłowe lub uszkodzone.
steps.jsontoxml.InCompatibleTypes 500 Ten błąd występuje, jeśli typ zmiennej zdefiniowanej w elemencie <Source> i elemencie <OutputVariable> są różne. Typ zmiennych w elemencie <Source> i elemencie <OutputVariable> musi być taki sam. Prawidłowe typy to message i string.
steps.jsontoxml.InvalidSourceType 500 Ten błąd występuje, jeśli typ zmiennej użytej do zdefiniowania elementu <Source> jest nieprawidłowy. Prawidłowe typy zmiennych to message i string.
steps.jsontoxml.OutputVariableIsNotAvailable 500 Ten błąd występuje, jeśli zmienna określona w elemencie <Source> zasady JSON to XML jest ciągiem znaków, a element <OutputVariable> nie jest zdefiniowany. Element <OutputVariable> jest wymagany, gdy zmienna zdefiniowana w elemencie <Source> jest ciągiem znaków.
steps.jsontoxml.SourceUnavailable 500 Ten błąd występuje, jeśli zmienna message określona w elemencie <Source> zasady JSON to XML ma jedną z tych wartości:
  • poza zakresem (niedostępne w konkretnym procesie, w którym jest wykonywana zasada) lub
  • Nie można rozwiązać (nie określono)

Błędy wdrażania

Brak.

Zmienne błędów

Te zmienne są ustawiane, gdy wystąpi błąd środowiska wykonawczego. Więcej informacji znajdziesz w artykule Co musisz wiedzieć o błędach związanych z naruszeniem zasad.

Zmienne Gdzie Przykład
fault.name="fault_name" fault_name to nazwa błędu podana w tabeli Błędy środowiska wykonawczego powyżej. Nazwa błędu to ostatnia część kodu. fault.name Matches "SourceUnavailable"
jsontoxml.policy_name.failed policy_name to określona przez użytkownika nazwa zasady, która spowodowała błąd. jsontoxml.JSON-to-XML-1.failed = true

Przykładowa odpowiedź na błąd

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

Przykładowa reguła błędu

<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