นโยบาย JSONtoXML

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

อะไร

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

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

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

ตัวอย่าง

ดูรายละเอียดเกี่ยวกับการแปลงระหว่าง JSON และ XML ได้ที่ ปัญหาการแปลงอาร์เรย์ JSON เป็นอาร์เรย์ XML ในออบเจ็กต์การตอบกลับ

การแปลงคำขอ

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

การกำหนดค่านี้ใช้ข้อความคำขอในรูปแบบ JSON เป็นแหล่งที่มา จากนั้นสร้างข้อความในรูปแบบ XML ที่ป้อนข้อมูลใน request OutputVariable. 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 เพื่อให้ดำเนินการตามขั้นตอนได้อย่างต่อเนื่องแม้จะมีนโยบายแล้วก็ตาม ล้มเหลว

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

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

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

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

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

เท็จ เลิกใช้

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

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

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

ไม่มี

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

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

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

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

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

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

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

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

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

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

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

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

<Options>/<OmitXmlDeclaration>

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

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

<OmitXmlDeclaration>true</OmitXmlDeclaration>

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

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>

<Options>/<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> elements

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

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

<Options>/<Indent>

ระบุให้เยื้องเอาต์พุต 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 ในโฟลว์คำขอขาเข้ามักจะ จับคู่กับนโยบาย XML เป็น JSON ในโฟลว์การตอบกลับขาออก การรวมนโยบายด้วยวิธีนี้จะช่วยให้แสดง API JSON สำหรับบริการที่รองรับเฉพาะ 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>

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