นโยบาย 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 ExportVariable 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> เพื่อติดป้ายกำกับนโยบายในเครื่องมือแก้ไขพร็อกซี UI การจัดการด้วยชื่อที่เป็นภาษาธรรมชาติที่แตกต่างออกไป

ไม่มีข้อมูล จำเป็น
continueOnError

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

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

false ไม่บังคับ
enabled

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

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

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

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

false เลิกใช้

องค์ประกอบ <DisplayName>

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

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

ไม่มีข้อมูล

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

การมีบุคคลอยู่ ไม่บังคับ
Type สตริง

องค์ประกอบ <Source>

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

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

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

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

องค์ประกอบ <ExportVariable>

จัดเก็บเอาต์พุตของการแปลงรูปแบบ 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> เป็นประเภทสตริง
ประเภท ข้อความ

<ตัวเลือก>/<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>

ระบุว่าพร็อพเพอร์ตี้ที่เรียกว่า #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>

<ตัวเลือก>/<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 Array ต่อไปนี้

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

ในโครงสร้าง XML ต่อไปนี้

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

<ตัวเลือก>/<เยื้อง>

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

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

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

ลงในองค์ประกอบ XML ต่อไปนี้

<person></person>

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

<person>I_AM_NULL</person>

องค์ประกอบ <Options>/< invalidCharsReplacement>

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

<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 ข้อผิดพลาดนี้เกิดขึ้นหากตัวแปร 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>

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