นโยบาย JSONtoXML

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

อะไร

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

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

หากต้องการแปลงคำขอในรูปแบบ JSON เป็นคำขอในรูปแบบ XML นโยบายจะแนบไปกับโฟลว์คำขอ (เช่น Request / 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>

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>

<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 ต่อไปนี้

[
"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 ในโฟลว์การตอบกลับขาออก การรวมนโยบายด้วยวิธีนี้จะช่วยให้แสดง 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>

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