Kebijakan JSONtoXML

Anda sedang melihat dokumentasi Apigee Edge.
Buka Dokumentasi Apigee X.
info

Apa

Kebijakan ini mengonversi pesan dari format JavaScript Object Notation (JSON) menjadi dapat diperluas bahasa markup (XML), yang memberi Anda beberapa opsi untuk mengontrol cara pesan dikonversi.

Kebijakan ini sangat berguna jika Anda ingin mengubah pesan menggunakan XSL. Sesudah mengonversi payload JSON ke XML, gunakan kebijakan Transformasi XSL dengan style sheet kustom untuk melakukan transformasi yang Anda butuhkan.

Dengan asumsi bahwa intent adalah untuk mengonversi permintaan berformat JSON menjadi permintaan berformat XML, kebijakan tersebut akan dilampirkan ke Alur permintaan (misalnya, Request / ProxyEndpoint / PostFlow).

Contoh

Untuk diskusi mendetail tentang konversi antara JSON dan XML, lihat http://community.apigee.com/articles/1839/converting-between-xml-and-json-what-you-need-to-k.html.

Mengonversi permintaan

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

Konfigurasi ini menggunakan pesan permintaan berformat JSON sebagai sumber, lalu membuat sebuah Pesan berformat XML yang diisi dalam OutputVariable request. Tepi secara otomatis menggunakan isi variabel ini sebagai pesan untuk langkah pemrosesan berikutnya.


Referensi elemen

Berikut adalah elemen dan atribut yang dapat Anda konfigurasi di kebijakan ini.

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

&lt;JSONToXML&gt; atribut

Tabel berikut menjelaskan atribut yang umum untuk semua elemen induk kebijakan:

Atribut Deskripsi Default Ketersediaan
name

Nama internal kebijakan. Nilai atribut name dapat berisi huruf, angka, spasi, tanda hubung, garis bawah, dan titik. Nilai ini tidak boleh melebihi 255 karakter.

Secara opsional, gunakan elemen <DisplayName> untuk memberi label kebijakan di editor proxy UI pengelolaan dengan nama natural language yang berbeda.

T/A Wajib
continueOnError

Tetapkan ke false untuk menampilkan error saat kebijakan gagal. Diharapkan untuk sebagian besar kebijakan.

Setel ke true agar eksekusi alur dapat dilanjutkan bahkan setelah kebijakan gagal.

salah Opsional
enabled

Setel ke true untuk menerapkan kebijakan.

Setel ke false untuk menonaktifkan kebijakan. Kebijakan ini tidak akan ditegakkan meskipun tetap terikat pada alur.

true Opsional
async

Atribut ini tidak digunakan lagi.

salah Tidak digunakan lagi

&lt;DisplayName&gt; elemen

Gunakan selain atribut name untuk memberi label kebijakan di editor proxy UI dengan nama natural language yang berbeda.

<DisplayName>Policy Display Name</DisplayName>
Default

T/A

Jika Anda menghapus elemen ini, nilai atribut name kebijakan akan menjadi data

Ketersediaan Opsional
Jenis String

&lt;Source&gt; elemen

Variabel, permintaan, atau respons, yang berisi pesan JSON yang ingin Anda jadikan tujuan konversi XML.

Jika <Source> tidak ditentukan, maka akan diperlakukan sebagai pesan (yang me-resolve untuk meminta saat kebijakan dilampirkan ke alur permintaan, atau respons saat kebijakan dilampirkan terhadap alur respons).

Jika variabel sumber tidak dapat di-resolve, atau di-resolve menjadi jenis bukan pesan, kebijakan tersebut menampilkan error.

<Source>request</Source>
Default permintaan atau respons, yang ditentukan oleh tempat kebijakan ditambahkan ke alur proxy API
Kehadiran Opsional
Jenis pesan

&lt;OutputVariable&gt; elemen

Menyimpan output konversi format JSON ke XML. Nilai ini biasanya sama dengan yaitu, biasanya permintaan JSON dikonversi ke permintaan XML.

Payload pesan JSON akan diuraikan dan dikonversi menjadi XML, serta jenis Konten HTTP header pesan berformat XML disetel ke text/xml;charset=UTF-8.

Jika OutputVariable tidak ditentukan, source diperlakukan sebagai OutputVariable. Misalnya, jika source adalah request, lalu OutputVariable secara default menjadi request.

<OutputVariable>request</OutputVariable>
Default permintaan atau respons, yang ditentukan oleh tempat kebijakan ditambahkan ke alur proxy API
Kehadiran Elemen ini bersifat wajib jika variabel yang ditentukan dalam elemen <Source> merupakan string jenis.
Jenis pesan

&lt;Options&gt;/&lt;OmitXmlDeclaration&gt;

Menentukan untuk menghilangkan namespace XML dari output. Nilai defaultnya adalah false yang berarti menyertakan namespace dalam output.

Misalnya, setelan berikut akan mengonfigurasi kebijakan untuk menghilangkan namespace:

<OmitXmlDeclaration>true</OmitXmlDeclaration>

&lt;Options&gt;/&lt;NamespaceBlockName&gt;
&lt;Options&gt;/&lt;DefaultNamespaceNodeName&gt;
&lt;Options&gt;/&lt;NamespaceSeparator&gt; elemen

JSON tidak mendukung namespace, sedangkan dokumen XML biasanya memerlukannya. NamespaceBlockName memungkinkan Anda menentukan properti JSON yang berfungsi sebagai sumber namespace dalam XML yang dihasilkan oleh kebijakan. (Ini berarti bahwa JSON sumber harus menyediakan properti yang bisa dipetakan ke dalam namespace yang diharapkan oleh aplikasi yang menggunakan XML yang dihasilkan.)

Misalnya, setelan berikut:

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

menunjukkan bahwa properti yang disebut #namespaces ada di JSON sumber yang berisi setidaknya satu namespace yang ditetapkan sebagai default. Contoh:

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

dikonversi menjadi:

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

&lt;Options&gt;/&lt;ObjectRootElementName&gt;

&lt;ObjectRootElementName&gt; menentukan nama elemen root saat Anda melakukan konversi dari JSON, yang tidak memiliki root bernama , ke XML.

Misalnya, jika JSON ditampilkan sebagai:

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

Setel &lt;ObjectRootElementName&gt; sebagai:

<ObjectRootElementName>Root</ObjectRootElementName>

XML yang dihasilkan akan muncul sebagai:

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

&lt;Options&gt;/&lt;AttributeBlockName&gt;
&lt;Options&gt;/&lt;AttributePrefix&gt; elemen

<AttributeBlockName> memungkinkan Anda menentukan kapan elemen JSON dikonversi menjadi atribut XML (bukan elemen XML).

Misalnya, setelan berikut mengonversi properti di dalam objek bernama #attrs ke dalam atribut XML:

<AttributeBlockName>#attrs</AttributeBlockName>

Objek JSON berikut:

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

dikonversi ke struktur XML berikut:

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

<AttributePrefix> mengonversi properti yang dimulai dengan awalan yang ditentukan ke dalam atribut XML. Jika awalan atribut ditetapkan ke @, misalnya:

<AttributePrefix>@</AttributePrefix>

Mengonversi objek JSON berikut:

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

 }
}

ke struktur XML berikut:

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

&lt;Options&gt;/&lt;ArrayRootElementName&gt;
&lt;Options&gt;/&lt;ArrayItemElementName&gt; elemen

Mengonversi array JSON menjadi daftar elemen XML dengan elemen induk dan turunan yang ditentukan nama.

Misalnya, setelan berikut:

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

mengonversi array JSON berikut:

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

ke dalam struktur XML berikut:

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

&lt;Options&gt;/&lt;Indent&gt;

Menentukan untuk mengindentasi output XML. Nilai defaultnya adalah false artinya tidak mengindentasi.

Misalnya, setelan berikut akan mengonfigurasi kebijakan untuk mengindentasi output:

<Indent>true</Indent>

Jika input JSON berbentuk:

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

Outputnya tanpa intdentasi adalah:

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

Dengan mengaktifkan indentasi, output-nya adalah:

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

&lt;Options&gt;/&lt;TextNodeName&gt; elemen

Mengonversi properti JSON menjadi node teks XML dengan nama yang ditentukan. Misalnya, setelan berikut:

<TextNodeName>age</TextNodeName>

mengonversi JSON ini:

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

ke struktur XML ini:

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

Jika TextNodeName tidak ditentukan, XML akan dibuat menggunakan setelan default untuk node teks:

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

&lt;Options&gt;/&lt;NullValue&gt; elemen

Menunjukkan nilai null. Secara default, nilainya adalah NULL.

Misalnya, setelan berikut:

<NullValue>I_AM_NULL</NullValue>
Mengonversi objek JSON berikut:
{"person" : "I_AM_NULL"}

ke elemen XML berikut:

<person></person>

Jika tidak ada nilai (atau nilai selain I_AM_NULL) yang ditentukan untuk nilai Null, payload yang sama akan dikonversi menjadi:

<person>I_AM_NULL</person>

&lt;Options&gt;/&lt;InvalidCharsReplacement&gt; elemen

Untuk membantu menangani XML tidak valid yang dapat menyebabkan masalah pada parser, setelan ini menggantikan elemen JSON yang menghasilkan XML yang tidak valid dengan string. Misalnya, setelan:

<InvalidCharsReplacement>_</InvalidCharsReplacement>

Mengonversi objek JSON ini

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

ke struktur XML ini:

<First_Name>John<First_Name>

Catatan penggunaan

Dalam skenario mediasi umum, kebijakan JSON ke XML pada alur permintaan masuk sering dipasangkan dengan kebijakan XMLtoJSON pada alur respons keluar. Dengan menggabungkan kebijakan ini, sebuah JSON API dapat diekspos untuk layanan yang secara native hanya mendukung XML.

Akan sangat berguna jika Anda menerapkan JSON default (kosong) ke kebijakan XML dan menambahkan elemen konfigurasi sesuai kebutuhan.

Untuk skenario saat API digunakan oleh beragam aplikasi klien yang mungkin memerlukan JSON dan XML, format respons dapat diatur secara dinamis dengan mengonfigurasi JSON ke XML dan XML untuk Kebijakan JSON yang akan dijalankan secara bersyarat. Lihat Variabel dan kondisi flow untuk penerapan skenario ini.

Skema

Referensi error

Bagian ini menjelaskan kode kesalahan dan pesan kesalahan yang dikembalikan dan variabel kesalahan yang disetel oleh Edge saat kebijakan ini memicu kesalahan. Informasi ini penting untuk diketahui jika Anda mengembangkan aturan kesalahan untuk menangani kesalahan. Untuk mempelajari lebih lanjut, lihat Yang perlu Anda ketahui tentang error kebijakan dan Penanganan kesalahan.

Error runtime

Error ini dapat terjadi saat kebijakan dijalankan.

Kode error Status HTTP Penyebab Perbaiki
steps.jsontoxml.ExecutionFailed 500 Payload input (JSON) kosong atau input (JSON) yang diteruskan ke kebijakan JSON ke XML tidak valid atau salah format.
steps.jsontoxml.InCompatibleTypes 500 Error ini terjadi jika jenis variabel yang ditentukan dalam elemen <Source> dan elemen <OutputVariable> tidak sama. Jenis atribut harus variabel yang ada dalam elemen <Source> dan elemen <OutputVariable> yang cocok. Jenis yang valid adalah message dan string.
steps.jsontoxml.InvalidSourceType 500 Error ini terjadi jika jenis variabel yang digunakan untuk menentukan elemen <Source> tidak valid. Jenis variabel yang valid adalah message dan string.
steps.jsontoxml.OutputVariableIsNotAvailable 500 Error ini terjadi jika variabel yang ditentukan dalam elemen <Source> dari JSON untuk Kebijakan XML memiliki jenis string dan elemen <OutputVariable> tidak ditentukan. Elemen <OutputVariable> bersifat wajib jika variabel ditentukan dalam <Source> adalah dari tipe string.
steps.jsontoxml.SourceUnavailable 500 Error ini terjadi jika pesan variabel yang ditentukan dalam elemen <Source> pada kebijakan JSON ke XML adalah:
  • di luar cakupan (tidak tersedia dalam alur spesifik tempat kebijakan dijalankan) atau
  • tidak dapat diselesaikan (tidak ditentukan)

Error saat deployment

Tidak ada.

Variabel kesalahan

Variabel ini ditetapkan saat terjadi error runtime. Untuk informasi selengkapnya, lihat Yang perlu Anda ketahui tentang error kebijakan.

Variabel Di mana Contoh
fault.name="fault_name" fault_name adalah nama kesalahan, seperti yang tercantum dalam tabel Error runtime di atas. Nama kesalahan adalah bagian terakhir dari kode kesalahan. fault.name Matches "SourceUnavailable"
jsontoxml.policy_name.failed policy_name adalah nama kebijakan yang ditentukan pengguna yang menampilkan kesalahan. jsontoxml.JSON-to-XML-1.failed = true

Contoh respons error

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

Contoh aturan kesalahan

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

Topik terkait