นโยบาย JSONtoXML

คุณกำลังดูเอกสารประกอบ Apigee Edge
ไปที่ เอกสารประกอบเกี่ยวกับ Apigee X.
ข้อมูล

อะไร

นโยบายนี้แปลงข้อความจากรูปแบบ JavaScript Object Notation (JSON) เป็นส่วนขยาย ภาษามาร์กอัป (XML) ซึ่งช่วยให้คุณมีตัวเลือกมากมายในการควบคุมวิธีการแปลงข้อความ

นโยบายจะเป็นประโยชน์อย่างยิ่งหากคุณต้องการเปลี่ยนรูปแบบข้อความโดยใช้ XSL หลัง การแปลงเพย์โหลด JSON เป็น XML ให้ใช้นโยบายการแปลง XSL ที่มีสไตล์ชีตที่กำหนดเองเพื่อ ดำเนินการเปลี่ยนรูปแบบที่ต้องการ

สมมติว่าความตั้งใจคือการแปลงคำขอรูปแบบ JSON เป็นคำขอรูปแบบ XML ระบบจะแนบนโยบายไปกับโฟลว์คำขอ (เช่น Request / ProxyEndpoint / PostFlow)

ตัวอย่าง

ดูการสนทนาอย่างละเอียดเกี่ยวกับการแปลงระหว่าง JSON และ XML ได้ที่ http://community.apigee.com/articles/1839/converting-between-xml-and-json-what-you-need-to-k.html

การแปลงคำขอ

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

การกำหนดค่านี้ใช้ข้อความคำขอรูปแบบ JSON เป็นแหล่งที่มา และสร้าง ข้อความรูปแบบ XML ที่สร้างขึ้นในตัวแปรเอาต์พุต request ขอบ จะใช้เนื้อหาของตัวแปรนี้เป็นข้อความโดยอัตโนมัติสำหรับขั้นตอนการประมวลผลถัดไป


การอ้างอิงองค์ประกอบ

องค์ประกอบและแอตทริบิวต์ที่คุณกำหนดค่าได้ในนโยบายนี้มีดังนี้

<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; แอตทริบิวต์

ตารางต่อไปนี้อธิบายแอตทริบิวต์ทั่วไปในองค์ประกอบระดับบนสุดของนโยบายทั้งหมด

แอตทริบิวต์ คำอธิบาย ค่าเริ่มต้น การมีบุคคลอยู่
name

ชื่อภายในของนโยบาย ค่าของแอตทริบิวต์ name สามารถ ประกอบด้วยตัวอักษร ตัวเลข การเว้นวรรค ขีดกลางสั้น ขีดล่าง และจุด ค่านี้ไม่สามารถ เกิน 255 อักขระ

(ไม่บังคับ) ใช้องค์ประกอบ <DisplayName> เพื่อติดป้ายกำกับนโยบายใน เครื่องมือแก้ไขพร็อกซี UI การจัดการด้วยชื่อที่เป็นภาษาธรรมชาติต่างกัน

ไม่มี ต้องระบุ
continueOnError

ตั้งค่าเป็น false เพื่อแสดงผลข้อผิดพลาดเมื่อนโยบายล้มเหลว เป็นเรื่องปกติ พฤติกรรมสำหรับนโยบายส่วนใหญ่

ตั้งค่าเป็น true เพื่อให้ดำเนินการตามขั้นตอนได้อย่างต่อเนื่องแม้จะมีนโยบายแล้วก็ตาม ล้มเหลว

เท็จ ไม่บังคับ
enabled

ตั้งค่าเป็น true เพื่อบังคับใช้นโยบาย

ตั้งค่าเป็น false เพื่อปิดนโยบาย นโยบายจะไม่ บังคับใช้ แม้ว่าจะยังคงแนบกับขั้นตอน

จริง ไม่บังคับ
async

แอตทริบิวต์นี้เลิกใช้งานแล้ว

เท็จ เลิกใช้

&lt;DisplayName&gt; องค์ประกอบ

ใช้เพิ่มเติมจากแอตทริบิวต์ name เพื่อติดป้ายกำกับนโยบายใน เครื่องมือแก้ไขพร็อกซี UI การจัดการด้วยชื่อที่เป็นภาษาธรรมชาติต่างกัน

<DisplayName>Policy Display Name</DisplayName>
ค่าเริ่มต้น

ไม่มี

หากไม่ใส่องค์ประกอบนี้ ค่าของแอตทริบิวต์ name ของนโยบายจะเป็น

การมีบุคคลอยู่ ไม่บังคับ
ประเภท สตริง

&lt;Source&gt; องค์ประกอบ

ตัวแปร คำขอ หรือการตอบกลับที่มีข้อความ JSON ที่คุณต้องการแปลงเป็น XML

หากไม่ได้กำหนด <Source> จะถือว่าเป็นข้อความ (ซึ่งแปลค่า เพื่อขอเมื่อมีการแนบนโยบายกับขั้นตอนคำขอ หรือตอบกลับเมื่อมีการแนบนโยบาย กับขั้นตอนการตอบกลับ)

หากแก้ไขตัวแปรแหล่งที่มาไม่ได้ หรือไม่แปลงตัวแปรเป็นประเภทที่ไม่ใช่ข้อความ นโยบาย เกิดข้อผิดพลาด

<Source>request</Source>
ค่าเริ่มต้น คำขอหรือการตอบกลับ ซึ่งกำหนดโดยตำแหน่งที่เพิ่มนโยบายลงในโฟลว์พร็อกซี API
การตรวจหาบุคคล ไม่บังคับ
ประเภท ข้อความ

&lt;OutputVariable&gt; องค์ประกอบ

จัดเก็บเอาต์พุตของการแปลงรูปแบบ JSON เป็น XML ซึ่งโดยปกติจะเป็นค่าเดียวกับ ต้นฉบับ กล่าวคือ โดยทั่วไปคำขอ JSON จะแปลงเป็นคำขอ XML

เพย์โหลดของข้อความ JSON จะได้รับการแยกวิเคราะห์และแปลงเป็น XML รวมถึงประเภทเนื้อหา HTTP ส่วนหัวของข้อความในรูปแบบ XML ได้รับการตั้งค่าเป็น text/xml;charset=UTF-8

หากไม่ได้ระบุ OutputVariable จะถือว่า source เป็น OutputVariable ตัวอย่างเช่น หาก source คือ request จากนั้น OutputVariable จะมีค่าเริ่มต้นเป็น request

<OutputVariable>request</OutputVariable>
ค่าเริ่มต้น คำขอหรือการตอบกลับ ซึ่งกำหนดโดยตำแหน่งที่เพิ่มนโยบายลงในโฟลว์พร็อกซี API
การตรวจหาบุคคล จำเป็นต้องมีองค์ประกอบนี้เมื่อตัวแปรที่กำหนดไว้ในองค์ประกอบ <Source> เป็นสตริงประเภท
ประเภท ข้อความ

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

ระบุเพื่อยกเว้นเนมสเปซ XML จากเอาต์พุต ค่าเริ่มต้นคือ false ซึ่งหมายถึงเนมสเปซในเอาต์พุต

เช่น การตั้งค่าต่อไปนี้จะกำหนดค่านโยบายเพื่อยกเว้นเนมสเปซ

<OmitXmlDeclaration>true</OmitXmlDeclaration>

&lt;Options&gt;/&lt;NamespaceBlockName&gt;
&lt;Options&gt;/&lt;DefaultNamespaceNodeName&gt;
&lt;Options&gt;/&lt;NamespaceSeparator&gt; องค์ประกอบ

JSON ไม่รองรับเนมสเปซ แต่เอกสาร XML มักจำเป็นต้องใช้เนมสเปซ NamespaceBlockName ช่วยให้คุณกำหนดพร็อพเพอร์ตี้ JSON ที่ทำหน้าที่เป็นแหล่งที่มาของเนมสเปซ ใน XML ที่นโยบายสร้างขึ้น (ซึ่งหมายความว่า JSON ต้นฉบับต้อง ระบุพร็อพเพอร์ตี้ที่สามารถแมปลงในเนมสเปซที่แอปพลิเคชันคาดหวังว่า จะใช้ XML ที่ได้)

ตัวอย่างเช่น การตั้งค่าต่อไปนี้

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

บ่งชี้ว่ามีพร็อพเพอร์ตี้ที่ชื่อ #namespaces อยู่ใน JSON ของแหล่งที่มาที่ มีเนมสเปซอย่างน้อย 1 รายการที่กำหนดให้เป็นค่าเริ่มต้น เช่น

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

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

&lt;ObjectRootElementName&gt; ระบุชื่อองค์ประกอบรูทเมื่อคุณแปลงจาก JSON ซึ่งไม่มีรากที่มีชื่อ เป็น XML

ตัวอย่างเช่น หาก JSON ปรากฏเป็นรูปแบบต่อไปนี้

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

และคุณตั้งค่า &lt;ObjectRootElementName&gt; เป็น:

<ObjectRootElementName>Root</ObjectRootElementName>

XML ผลลัพธ์จะปรากฏดังนี้

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

&lt;Options&gt;/&lt;AttributeBlockName&gt;
&lt;Options&gt;/&lt;AttributePrefix&gt; องค์ประกอบ

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

&lt;Options&gt;/&lt;ArrayRootElementName&gt;
&lt;Options&gt;/&lt;ArrayItemElementName&gt; องค์ประกอบ

แปลงอาร์เรย์ 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>

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

ระบุเพื่อเยื้องเอาต์พุต 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>

&lt;Options&gt;/&lt;TextNodeName&gt; องค์ประกอบ

แปลงพร็อพเพอร์ตี้ 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>

&lt;Options&gt;/&lt;NullValue&gt; องค์ประกอบ

ระบุค่า Null ค่าเริ่มต้นคือ NULL

ตัวอย่างการตั้งค่าต่อไปนี้

<NullValue>I_AM_NULL</NullValue>
แปลงออบเจ็กต์ JSON ต่อไปนี้ วันที่
{"person" : "I_AM_NULL"}

เข้ากับองค์ประกอบ XML ต่อไปนี้

<person></person>

เมื่อไม่มีการระบุค่า (หรือค่าอื่นที่ไม่ใช่ I_AM_NULL) สําหรับค่า Null เพย์โหลดเดียวกันจะแปลงเป็น

<person>I_AM_NULL</person>

&lt;Options&gt;/&lt;InvalidCharsReplacement&gt; องค์ประกอบ

เพื่อช่วยในการจัดการ XML ที่ไม่ถูกต้องซึ่งอาจทำให้เกิดปัญหากับโปรแกรมแยกวิเคราะห์ การตั้งค่านี้จะแทนที่ องค์ประกอบ JSON ใดๆ ที่สร้าง XML ที่ไม่ถูกต้องพร้อมด้วยสตริง ตัวอย่างเช่น URL ต่อไปนี้ การตั้งค่า:

<InvalidCharsReplacement>_</InvalidCharsReplacement>

แปลงออบเจ็กต์ JSON นี้

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

ในโครงสร้าง XML นี้

<First_Name>John<First_Name>

หมายเหตุการใช้งาน

ในสถานการณ์สื่อกลางทั่วไป นโยบาย JSON เป็น XML ในขั้นตอนคำขอขาเข้ามักจะ จับคู่กับนโยบาย XMLtoJSON ในขั้นตอนการตอบกลับขาออก เมื่อรวมนโยบายเข้าด้วยกันด้วยวิธีนี้ สามารถเปิดเผย JSON API สำหรับบริการที่สนับสนุนเฉพาะ XML ตั้งแต่ต้น

การใช้ JSON เริ่มต้น (ว่างเปล่า) กับนโยบาย XML แล้วเพิ่ม องค์ประกอบการกำหนดค่าตามที่จำเป็น

สำหรับกรณีที่แอปไคลเอ็นต์ที่หลากหลายใช้ API ซึ่งอาจต้องใช้ JSON และ XML คุณสามารถตั้งรูปแบบการตอบสนองแบบไดนามิกได้โดยกำหนดค่า JSON เป็น XML และ XML เพื่อ นโยบาย JSON ที่จะดำเนินการอย่างมีเงื่อนไข ดูตัวแปรและเงื่อนไขสำหรับโฟลว์ เพื่อนำสถานการณ์นี้ไปใช้

สคีมา

ข้อมูลอ้างอิงข้อผิดพลาด

ส่วนนี้จะอธิบายรหัสข้อผิดพลาดและข้อความแสดงข้อผิดพลาดที่แสดงกลับมา และตัวแปรข้อผิดพลาดที่ Edge ตั้งค่าไว้เมื่อนโยบายนี้ทริกเกอร์ข้อผิดพลาด ข้อมูลนี้มีความสำคัญต่อการทราบว่าคุณจะสร้างกฎความผิดพลาดเพื่อ จัดการกับข้อผิดพลาด หากต้องการเรียนรู้เพิ่มเติม โปรดดูที่สิ่งที่คุณจำเป็นต้องทราบ เกี่ยวกับข้อผิดพลาดของนโยบายและการจัดการ ข้อผิดพลาด

ข้อผิดพลาดเกี่ยวกับรันไทม์

ข้อผิดพลาดเหล่านี้อาจเกิดขึ้นเมื่อนโยบายทำงาน

รหัสข้อผิดพลาด สถานะ HTTP สาเหตุ แก้ไข
steps.jsontoxml.ExecutionFailed 500 เพย์โหลดอินพุต (JSON) ว่างเปล่าหรืออินพุต (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 เป็นประเภทสตริงและไม่มีการกำหนดองค์ประกอบ <OutputVariable> องค์ประกอบ <OutputVariable> เป็นข้อมูลที่ต้องระบุเมื่อตัวแปรที่กำหนดไว้ใน <Source> จัดอยู่ในประเภทสตริง
steps.jsontoxml.SourceUnavailable 500 ข้อผิดพลาดนี้จะเกิดขึ้นหากข้อความ ตัวแปรที่ระบุในองค์ประกอบ <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>

หัวข้อที่เกี่ยวข้อง