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

สคีมา

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

This section describes the fault codes and error messages that are returned and fault variables that are set by Edge when this policy triggers an error. This information is important to know if you are developing fault rules to handle faults. To learn more, see What you need to know about policy errors and Handling faults.

Runtime errors

These errors can occur when the policy executes.

Fault code HTTP status Cause Fix
steps.jsontoxml.ExecutionFailed 500 The input payload (JSON) is empty or the input (JSON) passed to JSON to XML policy is invalid or malformed.
steps.jsontoxml.InCompatibleTypes 500 This error occurs if the type of the variable defined in the <Source> element and the <OutputVariable> element are not the same. It is mandatory that the type of the variables contained within the <Source> element and the <OutputVariable> element matches. The valid types are message and string.
steps.jsontoxml.InvalidSourceType 500 This error occurs if the type of the variable used to define the <Source> element is invalid. The valid types of variable are message and string.
steps.jsontoxml.OutputVariableIsNotAvailable 500 This error occurs if the variable specified in the <Source> element of the JSON to XML Policy is of type string and the <OutputVariable> element is not defined. The <OutputVariable> element is mandatory when the variable defined in the <Source> element is of type string.
steps.jsontoxml.SourceUnavailable 500 This error occurs if the message variable specified in the <Source> element of the JSON to XML policy is either:
  • out of scope (not available in the specific flow where the policy is being executed) or
  • can't be resolved (is not defined)

Deployment errors

None.

Fault variables

These variables are set when a runtime error occurs. For more information, see What you need to know about policy errors.

Variables Where Example
fault.name="fault_name" fault_name is the name of the fault, as listed in the Runtime errors table above. The fault name is the last part of the fault code. fault.name Matches "SourceUnavailable"
jsontoxml.policy_name.failed policy_name is the user-specified name of the policy that threw the fault. jsontoxml.JSON-to-XML-1.failed = true

Example error response

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

Example fault rule

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

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