นโยบาย XMLtoJSON

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

อะไร

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

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

เกี่ยวกับ

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

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


ตัวอย่าง

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

กำลังแปลงคำตอบ

<XMLToJSON name="ConvertToJSON">
  <Options>
  </Options>
  <OutputVariable>response</OutputVariable>
  <Source>response</Source>
</XMLToJSON>

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


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

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

<XMLToJSON async="false" continueOnError="false" enabled="true" name="XML-to-JSON-1">
    <DisplayName>XML to JSON 1</DisplayName>
    <Source>response</Source>
    <OutputVariable>response</OutputVariable>
    <Options>
        <RecognizeNumber>true</RecognizeNumber>
        <RecognizeBoolean>true</RecognizeBoolean>
        <RecognizeNull>true</RecognizeNull>
        <NullValue>NULL</NullValue>
        <NamespaceBlockName>#namespaces</NamespaceBlockName>
        <DefaultNamespaceNodeName>&</DefaultNamespaceNodeName>
        <NamespaceSeparator>***</NamespaceSeparator>
        <TextAlwaysAsProperty>true</TextAlwaysAsProperty>
        <TextNodeName>TEXT</TextNodeName>
        <AttributeBlockName>FOO_BLOCK</AttributeBlockName>
        <AttributePrefix>BAR_</AttributePrefix>
        <OutputPrefix>PREFIX_</OutputPrefix>
        <OutputSuffix>_SUFFIX</OutputSuffix>
        <StripLevels>2</StripLevels>
        <TreatAsArray>
            <Path unwrap="true">teachers/teacher/studentnames/name</Path>
        </TreatAsArray>
    </Options>
    <!-- Use Options or Format, not both -->
    <Format>yahoo</Format>
</XMLToJSON>

&lt;XMLtoJSON&gt; แอตทริบิวต์

<XMLtoJSON async="false" continueOnError="false" enabled="true" name="XML-to-JSON-1"> 

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

แอตทริบิวต์ คำอธิบาย ค่าเริ่มต้น การมีบุคคลอยู่
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; องค์ประกอบ

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

ส่วนหัวประเภทเนื้อหา HTTP ของข้อความต้นฉบับต้องตั้งค่าเป็น application/xml ไม่เช่นนั้นนโยบายจะไม่มีผลบังคับใช้

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

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

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

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

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

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

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

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

&lt;Options&gt;

ตัวเลือกต่างๆ ช่วยให้คุณควบคุมการแปลงจาก XML เป็น JSON ได้ ใช้ <Options> ซึ่งจะช่วยให้คุณเพิ่มการตั้งค่า Conversion ที่ต้องการ หรือ <Format> ซึ่งให้คุณอ้างอิงเทมเพลตของ ตัวเลือกที่กำหนดไว้ล่วงหน้า คุณไม่สามารถใช้ทั้ง <Options> และ <Format>

ต้องระบุ <Options> หากไม่ใช้ <Format>

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

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

<RecognizeNumber>true</RecognizeNumber>

ลองดูตัวอย่าง XML ต่อไปนี้

<a>
  <b>100</b>
  <c>value</c>
</a>

หากเป็น true ให้แปลงเป็น

{
    "a": {
        "b": 100,
        "c": "value"
    }
}

หากเป็น false ให้แปลงเป็น

{
    "a": {
        "b": "100",
        "c": "value"
    }
}
ค่าเริ่มต้น เท็จ
การตรวจหาบุคคล ไม่บังคับ
ประเภท บูลีน

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

ให้ Conversion คงค่าจริง/เท็จไว้แทนการเปลี่ยนค่าเป็น สตริง

<RecognizeBoolean>true</RecognizeBoolean>

สำหรับตัวอย่าง XML ต่อไปนี้

<a>
  <b>true</b>
  <c>value</c>
</a>

หากเป็น true ให้แปลงเป็น

{
    "a": {
        "b": true,
        "c": "value"
    }
}

หากเป็น false ให้แปลงเป็น

{
    "a": {
        "b": "true",
        "c": "value"
    }
}
ค่าเริ่มต้น เท็จ
การตรวจหาบุคคล ไม่บังคับ
ประเภท บูลีน

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

ให้คุณแปลงค่าว่างเป็นค่าว่างได้

<RecognizeNull>true</RecognizeNull>

สำหรับ XML ต่อไปนี้

<a>
  <b></b>
  <c>value</c>
</a>

หากเป็น true ให้แปลงเป็น

{
  "a": {
    "b": null,
    "c": "value"
  }
}

หากเป็น false ให้แปลงเป็น

{
  "a": {
    "b": {},
    "c": "value"
  }
}
ค่าเริ่มต้น เท็จ
การตรวจหาบุคคล ไม่บังคับ
ประเภท บูลีน

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

บ่งชี้ค่าที่ควรเป็นค่า Null ที่รู้จักในข้อความต้นฉบับ แปลงแล้ว ค่าเริ่มต้นคือ null ตัวเลือกนี้มีผลเฉพาะ หาก RecognizeNull เป็นจริง

<NullValue>not-present</NullValue>

ค่าเริ่มต้น null
การตรวจหาบุคคล ไม่บังคับ
ประเภท สตริง

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

ใช้องค์ประกอบเหล่านี้ร่วมกัน

<NamespaceBlockName>#namespaces</NamespaceBlockName>
<DefaultNamespaceNodeName>&</DefaultNamespaceNodeName>
<NamespaceSeparator>***</NamespaceSeparator>

ลองดูตัวอย่าง XML ต่อไปนี้

<a xmlns="http://ns.com" xmlns:ns1="http://ns1.com">
  <ns1:b>value</ns1:b>
</a>

หากไม่ได้ระบุ NamespaceSeparator โครงสร้าง JSON ต่อไปนี้จะเป็น สร้างแล้ว:

{
    "a": {
        "b": "value"
    }
}

หากองค์ประกอบ NamespaceBlockName, DefaultNamespaceNodeName และ NamespaceSeparator ระบุเป็น #namespaces, &, และ *** ตามลำดับ ระบบจะสร้างโครงสร้าง JSON ต่อไปนี้

{
    "a": {
        "#namespaces": {
            "&": "http://ns.com",
            "ns1": "http://ns1.com"
        },
        "ns1***b": "value"
    }
}
ค่าเริ่มต้น โปรดดูตัวอย่างด้านบน
การตรวจหาบุคคล ไม่บังคับ
อย่างไรก็ตาม หากคุณระบุ <NamespaceBlockName> คุณต้องระบุ อีก 2 องค์ประกอบ
ประเภท สตริง

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

ใช้องค์ประกอบเหล่านี้ร่วมกัน

หากตั้งค่าเป็น true ระบบจะแปลงเนื้อหาขององค์ประกอบ XML เป็นสตริง

<TextAlwaysAsProperty>true</TextAlwaysAsProperty>
<TextNodeName>TEXT</TextNodeName>

สำหรับ XML ต่อไปนี้

<a>
  <b>value1</b>
  <c>value2<d>value3</d>value4</c>
</a>

หากตั้งค่า TextAlwaysAsProperty เป็น true และ TextNodeName ระบุเป็น TEXT โครงสร้าง JSON ต่อไปนี้จะถูกสร้างขึ้น:

{
  "a": {
    "b": {
      "TEXT": "value1"
    },
    "c": {
      "TEXT": [
        "value2",
        "value4"
        ],
        "d": {
          "TEXT": "value3"
        }
      }
    }
}

หากตั้งค่า TextAlwaysAsProperty เป็น false และ TextNodeName ระบุเป็น TEXT โครงสร้าง JSON ต่อไปนี้คือ สร้างแล้ว:

{
  "a": {
    "b": "value1",
    "c": {
      "TEXT": [
        "value2",
        "value4"
      ],
      {
        "d": "value3",
      }
    }
}
ค่าเริ่มต้น <TextAlwaysAsProperty>: เท็จ
<TextNodeName>: ไม่มี
การตรวจหาบุคคล ไม่บังคับ
ประเภท <TextAlwaysAsProperty>: บูลีน
<TextNodeName>: สตริง

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

ใช้องค์ประกอบเหล่านี้ร่วมกัน

ให้คุณจัดกลุ่มค่าลงในบล็อก JSON และเพิ่มคำนำหน้าในชื่อแอตทริบิวต์

<AttributeBlockName>FOO_BLOCK</AttributeBlockName>
<AttributePrefix>BAR_</AttributePrefix>

ลองดูตัวอย่าง XML ต่อไปนี้

<a attrib1="value1" attrib2="value2"/>

หากทั้งแอตทริบิวต์ (AttributeBlockName และ AttributePrefix) คือ ตามที่ระบุในตัวอย่าง XML เป็น JSON ระบบจะสร้างโครงสร้าง JSON ต่อไปนี้

{
  "a": {
    "FOO_BLOCK": {
      "BAR_attrib1": "value1",
      "BAR_attrib2": "value2"
    }
  }
}

หากระบุเฉพาะ AttributeBlockName โครงสร้าง JSON ต่อไปนี้จะเป็น สร้างแล้ว:

{
    "a": {
        "FOO_BLOCK": {
            "attrib1": "value1",
            "attrib2": "value2"
        }
    }
}

หากระบุเฉพาะ AttributePrefix โครงสร้าง JSON ต่อไปนี้จะเป็น สร้างแล้ว:

{
    "a": {
        "BAR_attrib1": "value1",
        "BAR_attrib2": "value2"
    }
}

หากไม่ได้ระบุไว้ทั้งคู่ ระบบจะสร้างโครงสร้าง JSON ต่อไปนี้

{
    "a": {
        "attrib1": "value1",
        "attrib2": "value2"
    }
}
ค่าเริ่มต้น โปรดดูตัวอย่างด้านบน
การตรวจหาบุคคล ไม่บังคับ
ประเภท สตริง

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

ใช้องค์ประกอบเหล่านี้ร่วมกัน

<OutputPrefix>PREFIX_</OutputPrefix>
<OutputSuffix>_SUFFIX</OutputSuffix>

ลองดูตัวอย่าง XML ต่อไปนี้

<a>value</a>

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

PREFIX_{
    "a": "value"
}_SUFFIX

หากระบุเฉพาะ OutputPrefix ระบบจะสร้างโครงสร้าง JSON ต่อไปนี้

PREFIX_{
  "a" : "value"
}

หากระบุเฉพาะ OutputSuffix ระบบจะสร้างโครงสร้าง JSON ต่อไปนี้

{
  "a" : "value"
}_SUFFIX

หากไม่ได้ระบุ OutputPrefix และ OutputSuffix ไว้ พารามิเตอร์ต่อไปนี้ ระบบจะสร้างโครงสร้าง JSON ดังนี้

{
    "a": "value"
}
ค่าเริ่มต้น ดูตัวอย่างด้านบน
การตรวจหาบุคคล ไม่บังคับ
ประเภท สตริง

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

<Options>
    <StripLevels>4</StripLevels>
</Options>

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

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/Schemata-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
      <GetCityWeatherByZIPResponse xmlns="http://ws.cdyne.com/WeatherWS/">
          <GetCityWeatherByZIPResult>
              <State>CO</State>
              <City>Denver</City>
              <Description>Sunny</Description>
              <Temperature>62</Temperature>
          </GetCityWeatherByZIPResult>
      </GetCityWeatherByZIPResponse>
  </soap:Body>
</soap:Envelope>

มี 4 ระดับก่อนที่คุณจะไปที่ระดับรัฐ เมือง คําอธิบาย และอุณหภูมิ หากไม่ได้ใช้ <StripLevels> การตอบสนอง JSON ที่แปลงแล้วจะมีลักษณะดังนี้ ดังนี้

{
   "Envelope" : {
      "Body" : {
         "GetCityWeatherByZIPResponse" : {
            "GetCityWeatherByZIPResult" : {
               "State" : "CO",
               "City" : "Denver",
               "Description" : "Sunny",
               "Temperature" : "62"
            }
         }
      }
   }
}

ถ้าคุณต้องการตัด 4 ระดับแรกออกในการตอบกลับ JSON คุณควรตั้งค่า <StripLevels>4</StripLevels> ซึ่งจะให้สิ่งต่อไปนี้แก่คุณ JSON:

{
  "State" : "CO",
  "City" : "Denver",
  "Description" : "Sunny",
  "Temperature" : "62"
}

คุณสามารถตัดระดับไปถึงองค์ประกอบแรกที่มีรายการย่อยหลายรายการ ทำอะไรได้บ้าง หมายความว่าอย่างไร มาดูตัวอย่าง JSON ที่ซับซ้อนมากขึ้นกัน

{
   "Envelope" : {
      "Body" : {
         "GetCityForecastByZIPResponse" : {
            "GetCityForecastByZIPResult" : {
               "ResponseText" : "City Found",
               "ForecastResult" : {
                  "Forecast" : [
                     {
                        "ProbabilityOfPrecipiation" : {
                           "Nighttime" : "00",
                           "Daytime" : 10
                        }  ...

ระดับ 3 ในตัวอย่างนี้คือ GetCityForecastByZIPResponse ซึ่งมีเพียงระดับเดียว ของบุตรหลาน ดังนั้นหากคุณใช้ <StripLevels>3</StripLevels> (นำ 3 ระดับแรก) JSON จะมีลักษณะดังนี้

{
   "GetCityForecastByZIPResult" : {
      "ResponseText" : "City Found",
      "ForecastResult" : {
         "Forecast" : [
            {
               "ProbabilityOfPrecipiation" : {
                  "Nighttime" : "00",
                  "Daytime" : 10
               }  ...

โปรดสังเกตว่า GetCityForecastByZIPResult มีเด็กหลายคน เนื่องจากเป็น องค์ประกอบแรกที่มีลูกหลายคน คุณสามารถตัดระดับสุดท้ายนี้ได้โดยใช้ <StripLevels>4</StripLevels> ซึ่งจะให้สิ่งต่อไปนี้แก่คุณ JSON:

{
   "ResponseText" : "City Found",
   "ForecastResult" : {
      "Forecast" : [
         {
            "ProbabilityOfPrecipiation" : {
               "Nighttime" : "00",
               "Daytime" : 10
            }  ...

เนื่องจากระดับ 4 เป็นระดับแรกที่มีเด็กหลายคน คุณจึงตัดระดับออกไม่ได้ ต่ำกว่านี้ หากคุณตั้งระดับแถบเป็น 5, 6, 7 และอื่นๆ คุณจะได้รับแอตทริบิวต์ คำตอบด้านบน

ค่าเริ่มต้น 0 (ไม่มีระดับการตัด)
การตรวจหาบุคคล ไม่บังคับ
ประเภท จำนวนเต็ม

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

<Options>
    <TreatAsArray>
        <Path unwrap="true">teachers/teacher/studentnames/name</Path>
    </TreatAsArray>
</Options>

ชุดค่าผสมขององค์ประกอบนี้ช่วยให้มั่นใจได้ว่าค่าจากเอกสาร XML จะใส่ไว้ใน JSON อาร์เรย์ วิธีนี้มีประโยชน์ ตัวอย่างเช่น เมื่อจำนวนองค์ประกอบย่อยอาจแตกต่างกัน (ตั้งแต่หนึ่งองค์ประกอบถึง หลายรายการ) และคุณต้องการให้ค่าอยู่ในอาร์เรย์เสมอ การทำเช่นนี้จะช่วยให้ โค้ดคงที่เนื่องจากคุณสามารถรับข้อมูลจากอาร์เรย์แบบเดียวกันทุกครั้ง สำหรับ ตัวอย่าง: $.teachers.teacher.studentnames[0] จะได้รับค่าชื่อนักเรียนครั้งแรก ในอาร์เรย์โดยไม่คำนึงถึงจำนวนค่าในอาร์เรย์

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

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

<teacher>
    <name>teacherA</name>
    <studentnames>
        <name>student1</name>
        <name>student2</name>
    </studentnames>
</teacher>

...ถูกแปลงเป็น JSON ต่อไปนี้โดยอัตโนมัติโดยไม่มีนโยบายพิเศษ การกำหนดค่า:

{
  "teachers" : {
      "teacher" : {
          "name" : "teacherA",
          "studentnames" : {
              "name" : [
                 "student1",
                 "student2"
              ]}
           }
      }
}

สังเกตว่าชื่อนักเรียนทั้ง 2 คนอยู่ในอาร์เรย์

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

{
  "teachers" : {
      "teacher" : {
          "name" : "teacherA",
          "studentnames" : {
              "name" : "student1"
              }
          }
      }
}

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

<Options>
    <TreatAsArray>
        <Path>teachers/teacher/studentnames/name</Path>
    </TreatAsArray>
</Options>

การกำหนดค่าข้างต้นจะเขียน JSON ดังนี้

{
  "teachers" : {
      "teacher" : {
          "name" : "teacherA",
          "studentnames" : {
              "name" : ["student1"]
              }
            ]
          }
      }
}

โปรดสังเกตว่าStudent1 อยู่ในอาร์เรย์แล้ว ในปัจจุบัน ไม่ว่าตอนนี้จะมี คุณสามารถดึงนักเรียนจากอาร์เรย์ JSON ในโค้ดของคุณโดยใช้ JSONPath ต่อไปนี้ $.teachers.teacher.studentnames.name[0]

องค์ประกอบ <Path> ยังมีแอตทริบิวต์ unwrap ตามที่อธิบายไว้ใน หัวข้อถัดไป

ค่าเริ่มต้น NA
การตรวจหาบุคคล ไม่บังคับ
ประเภท สตริง

Attributes

 <Options>
    <TreatAsArray>
        <Path unwrap="true">teachers/teacher/studentnames/name</Path>
    </TreatAsArray>
</Options>
แอตทริบิวต์ คำอธิบาย การมีบุคคลอยู่ ประเภท
แยก

ค่าเริ่มต้น: เท็จ

นำองค์ประกอบออกจากเอาต์พุต JSON ใช้สิ่งนี้เพื่อปรับปรุงประสิทธิภาพหรือทำให้แยกเป็นหลายรายการ ("แยก") JSON ซึ่งจะย่อ JSONPath ที่จำเป็นในการเรียกค่าด้วย ตัวอย่างเช่น แทนที่จะเป็น $.teachers.teacher.studentnames.name[*] คุณสามารถรวม JSON และใช้ $.teachers.studentnames[*]

ต่อไปนี้คือตัวอย่าง JSON

{
  "teachers" : {
      "teacher" : {
          "name" : "teacherA",
          "studentnames" : {
              "name" : [
                 "student1",
                 "student2"
              ]}...

ในตัวอย่างนี้ คุณอาจโต้แย้งว่าองค์ประกอบ teacher และ ไม่จำเป็นต้องมีองค์ประกอบ name ที่เป็นนักเรียน คุณจึงสามารถนำออกหรือแยก ให้พวกเขา ต่อไปนี้คือวิธีกำหนดค่าองค์ประกอบ <Path>

<TreatAsArray>
    <Path unwrap="true">teachers/teacher</Path>
    <Path unwrap="true">teachers/teacher/studentnames/name</Path>
</TreatAsArray>

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

{
  "teachers" : [{
      "name" : "teacherA",
      "studentnames" : ["student1","student2"]
      }]...

โปรดทราบว่าเนื่องจากองค์ประกอบ <Path> อยู่ใน <TreatAsArray> ทั้ง 2 องค์ประกอบในเส้นทางจะเป็น ถือเป็นอาร์เรย์ในเอาต์พุต JSON

ไม่บังคับ บูลีน

ดูตัวอย่างเพิ่มเติมและคำแนะนำแบบทีละขั้นได้ที่บทความชุมชน Apigee นี้ https://community.apigee.com/content/kbentry/33374/new-edge-minifeature-the-treatasarray-option-in-th.html

&lt;Format&gt;

รูปแบบให้คุณควบคุมการแปลงจาก XML เป็น JSON ป้อนชื่อของ เทมเพลตที่มีชุดค่าผสมขององค์ประกอบตัวเลือกที่เฉพาะเจาะจงที่อธิบายไว้ในหัวข้อนี้ รูปแบบที่กำหนดไว้ล่วงหน้า ได้แก่ xml.com, yahoo, google, badgerFish

ใช้องค์ประกอบ <Format> หรือกลุ่ม <Options> คุณไม่สามารถใช้ ทั้ง <Format> และ <Options>

ต่อไปนี้คือคำจำกัดความของรูปแบบสำหรับเทมเพลตที่กำหนดไว้ล่วงหน้าแต่ละรายการ

xml.com

<RecognizeNull>true</RecognizeNull>
<TextNodeName>#text</TextNodeName>
<AttributePrefix>@</AttributePrefix>

yahoo

<RecognizeNumber>true</RecognizeNumber>
<TextNodeName>content</TextNodeName>

Google

<TextNodeName>$t</TextNodeName>
<NamespaceSeparator>$</NamespaceSeparator>
<TextAlwaysAsProperty>true</TextAlwaysAsProperty>

badgerFish

<TextNodeName>$</TextNodeName>
<TextAlwaysAsProperty>true</TextAlwaysAsProperty>
<AttributePrefix>@</AttributePrefix>
<NamespaceSeparator>:</NamespaceSeparator>
<NamespaceBlockName>@xmlns</NamespaceBlockName>
<DefaultNamespaceNodeName>$</DefaultNamespaceNodeName>

ไวยากรณ์องค์ประกอบ

<Format>yahoo</Format>
ค่าเริ่มต้น ป้อนชื่อรูปแบบที่ใช้ได้:
xml.com yahoo google badgerFish
การตรวจหาบุคคล ต้องระบุหากไม่ใช้ <Options>
ประเภท สตริง

สคีมา


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

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

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

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

รหัสข้อผิดพลาด สถานะ HTTP สาเหตุ แก้ไข
steps.xmltojson.ExecutionFailed 500 ข้อผิดพลาดนี้เกิดขึ้นเมื่อเพย์โหลดอินพุต (XML) ว่างเปล่า หรือ XML อินพุตไม่ถูกต้องหรือผิดรูปแบบ
steps.xmltojson.InCompatibleType 500 ข้อผิดพลาดนี้เกิดขึ้นหากประเภทตัวแปรที่กำหนดไว้ในองค์ประกอบ <Source> และ องค์ประกอบ <OutputVariable> ไม่เหมือนกัน ซึ่งจำเป็นต้องมีประเภทของตัวแปร ที่มีอยู่ภายในองค์ประกอบ <Source> และองค์ประกอบ <OutputVariable> ตรงกัน
steps.xmltojson.InvalidSourceType 500 ข้อผิดพลาดนี้เกิดขึ้นหากประเภทของตัวแปรที่ใช้กำหนดองค์ประกอบ <Source> คือ ไม่ถูกต้อง ประเภทตัวแปรที่ถูกต้องคือ ข้อความและสตริง
steps.xmltojson.OutputVariableIsNotAvailable 500 ข้อผิดพลาดนี้เกิดขึ้นหากตัวแปรที่ระบุในองค์ประกอบ <Source> ของ XML ถึง นโยบาย JSON เป็นสตริงประเภทและไม่ได้กำหนดองค์ประกอบ <OutputVariable> องค์ประกอบ <OutputVariable> เป็นข้อมูลที่ต้องระบุเมื่อตัวแปรที่กำหนดไว้ใน <Source> จัดอยู่ในประเภทสตริง
steps.xmltojson.SourceUnavailable 500 ข้อผิดพลาดนี้จะเกิดขึ้นหากข้อความ ตัวแปรที่ระบุในองค์ประกอบ <Source> ของนโยบาย XML เป็น JSON มีดังนี้
  • อยู่นอกขอบเขต (ใช้ไม่ได้ในขั้นตอนที่เจาะจงซึ่งจะมีการบังคับใช้นโยบาย) หรือ
  • ไม่สามารถแก้ไขได้ (ไม่ได้กำหนด)

ข้อผิดพลาดในการทำให้ใช้งานได้

ข้อผิดพลาดเหล่านี้อาจเกิดขึ้นเมื่อคุณใช้พร็อกซีที่มีนโยบายนี้

ชื่อข้อผิดพลาด สาเหตุ แก้ไข
EitherOptionOrFormat หากองค์ประกอบใดองค์ประกอบหนึ่ง <Options> หรือ <Format> ไม่ใช่ ที่ประกาศไว้ในนโยบาย XML เป็น JSON การทำให้พร็อกซี API ใช้งานได้จึงล้มเหลว
UnknownFormat หากองค์ประกอบ <Format> ภายในนโยบาย XML เป็น JSON มีข้อมูลที่ไม่รู้จัก กำหนดไว้ การทำให้พร็อกซี API ใช้งานได้ล้มเหลว รูปแบบที่กำหนดไว้ล่วงหน้าได้แก่ xml.com, yahoo, google และ badgerFish

ตัวแปรความผิดพลาด

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

ตัวแปร สถานที่ ตัวอย่าง
fault.name="fault_name" fault_name คือชื่อของข้อผิดพลาดตามที่ระบุไว้ในตารางข้อผิดพลาดรันไทม์ด้านบน ชื่อข้อผิดพลาดคือส่วนสุดท้ายของรหัสข้อผิดพลาด fault.name = "SourceUnavailable"
xmltojson.policy_name.failed policy_name คือชื่อที่ผู้ใช้ระบุของนโยบายที่เป็นสาเหตุของข้อผิดพลาด xmltojson.XMLtoJSON-1.failed = true

ตัวอย่างการตอบสนองข้อผิดพลาด

{
  "fault": {
    "faultstring": "XMLToJSON[XMLtoJSON-1]: Source xyz is not available",
    "detail": {
      "errorcode": "steps.xml2json.SourceUnavailable"
    }
  }
}

ตัวอย่างกฎข้อผิดพลาด

<faultrule name="VariableOfNonMsgType"></faultrule><FaultRule name="XML to JSON Faults">
    <Step>
        <Name>AM-SourceUnavailableMessage</Name>
        <Condition>(fault.name Matches "SourceUnavailable") </Condition>
    </Step>
    <Step>
        <Name>AM-BadXML</Name>
        <Condition>(fault.name = "ExecutionFailed")</Condition>
    </Step>
    <Condition>(xmltojson.XMLtoJSON-1.failed = true) </Condition>
</FaultRule>

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

JSON เป็น XML: JSON เป็น XML นโยบาย