سياسة XMLtoJSON

أنت الآن بصدد الاطّلاع على مستندات Apigee Edge.
انتقِل إلى مستندات Apigee X.
info

الأدوات المستخدمة

تحوّل هذه السياسة الرسائل من تنسيق لغة الترميز القابلة للتوسيع (XML) إلى تنسيق JavaScript Object Notation (JSON)، ما يمنحك عدة خيارات للتحكّم في كيفية تحويل الرسائل.

بافتراض أنّ الهدف هو تحويل استجابة بتنسيق XML إلى استجابة بتنسيق JSON، سيتم إرفاق السياسة بتدفّق استجابة (على سبيل المثال، الاستجابة / ProxyEndpoint / PostFlow).

لمحة

في سيناريو التوسّط النموذجي، غالبًا ما يتم إقران سياسة JSON إلى XML في مسار طلب وارد بسياسة XML إلى JSON في مسار استجابة صادرة. ومن خلال الجمع بين السياسات بهذه الطريقة، يمكن عرض واجهة برمجة تطبيقات JSON للخدمات الخلفية التي لا تتوافق بشكلٍ أصلي إلا مع XML.

في الحالات التي تستخدم فيها تطبيقات عميل متنوعة واجهات برمجة التطبيقات التي قد تتطلب JSON أو XML، يمكن ضبط تنسيق الاستجابة بشكل ديناميكي من خلال إعداد سياسات JSON إلى XML وXML إلى JSON ليتم تنفيذها بشكل مشروط. يمكنك الاطّلاع على متغيرات التدفق والشروط للحصول على مثال على تنفيذ هذا السيناريو.


نماذج

للحصول على مناقشة تفصيلية حول التحويل بين JSON وXML، يُرجى الاطّلاع على التحويل بين XML وJSON باستخدام Apigee: ما تحتاج إلى معرفته.

تحويل ردّ

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

يتطلّب هذا الإعداد، وهو الحد الأدنى من الإعدادات المطلوبة لتحويل XML إلى JSON، رسالة استجابة بتنسيق XML كمصدر، ثم ينشئ رسالة بتنسيق JSON يتم ملؤها في response OutputVariable. يستخدم Edge تلقائيًا محتوى هذا المتغيّر كرسالة لخطوة المعالجة التالية.


مرجع العنصر

في ما يلي العناصر والسمات التي يمكنك ضبطها في هذه السياسة.

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

سمات <XMLtoJSON>

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

يصف الجدول التالي السمات المشتركة بين جميع العناصر الرئيسية للسياسة:

السمة الوصف تلقائي التواجد في المنزل
name

الاسم الداخلي للسياسة. يمكن لقيمة السمة name أن تحتوي على أحرف وأرقام ومسافات وواصلات وشرطات سفلية ونقاط. لا يمكن لهذه القيمة يتجاوز 255 حرفًا.

يمكنك، إذا أردت، استخدام العنصر <DisplayName> لتصنيف السياسة محرر الخادم الوكيل لواجهة مستخدم الإدارة باسم مختلف بلغة طبيعية.

لا ينطبق مطلوب
continueOnError

اضبط القيمة على false لعرض رسالة خطأ عند تعذُّر تنفيذ سياسة. هذا متوقّع السلوك في معظم السياسات.

يمكنك ضبط القيمة على true لمواصلة تنفيذ المسار حتى بعد تطبيق إحدى السياسات. فشل.

خطأ اختياري
enabled

اضبط القيمة على true لفرض السياسة.

اضبط القيمة على false من أجل إيقاف السياسة. لن تكون السياسة ويتم فرضها حتى لو ظلت مرتبطة بتدفق.

صحيح اختياري
async

تم إيقاف هذه السمة نهائيًا.

خطأ منهي العمل به

&lt;DisplayName&gt; عنصر

استخدِمه مع السمة name لتصنيف السياسة في إدارة خادم وكيل لواجهة المستخدم باسم مختلف بلغة طبيعية.

<DisplayName>Policy Display Name</DisplayName>
تلقائي

لا ينطبق

إذا لم تستخدم هذا العنصر، سيتم ضبط قيمة السمة name للسياسة على النحو التالي: استخدام البيانات المختلفة.

التواجد في المنزل اختياري
النوع سلسلة

العنصر <Source>

المتغير أو الطلب أو الرد الذي يحتوي على رسالة XML التي تريد تحويلها إلى JSON

يجب ضبط عنوان HTTP Content-type للرسالة المصدر على application/xml، وإلا لن يتم فرض السياسة.

إذا لم يتم تحديد <Source>، سيتم التعامل معه كرسالة (يتم تحويلها إلى طلب عندما تكون السياسة مرتبطة بسير عمل الطلب، أو استجابة عندما تكون السياسة مرتبطة بسير عمل الاستجابة).

إذا تعذّر تحليل متغيّر المصدر أو تم تحليله إلى نوع غير نوع الرسالة، ستعرض السياسة خطأً.

<Source>response</Source>
تلقائي طلب أو ردّ، يتم تحديده حسب المكان الذي تتم فيه إضافة السياسة إلى مسار خادم وكيل لواجهة برمجة التطبيقات
التواجد اختياري
النوع رسالة

عنصر <OutputVariable>

يخزِّن هذا الحقل ناتج عملية تحويل تنسيق XML إلى JSON. عادةً ما تكون هذه القيمة هي نفسها قيمة المصدر، أي أنّه يتم عادةً تحويل استجابة XML إلى استجابة JSON.

يتم تحليل حمولة رسالة XML وتحويلها إلى JSON، ويتم ضبط عنوان HTTP Content-type الخاص بالرسالة المنسَّقة بتنسيق XML على application/json.

إذا لم يتم تحديد OutputVariable، يتم التعامل مع source على أنّه OutputVariable. على سبيل المثال، إذا كانت قيمة source هي response، ستكون القيمة التلقائية لـ OutputVariable هي response.

<OutputVariable>response</OutputVariable>
تلقائي طلب أو ردّ، يتم تحديده حسب المكان الذي تتم فيه إضافة السياسة إلى مسار خادم وكيل لواجهة برمجة التطبيقات
التواجد هذا العنصر إلزامي عندما يكون المتغيّر المحدّد في العنصر <Source> من نوع السلسلة.
النوع رسالة

<خيارات>

تمنحك الخيارات إمكانية التحكّم في عملية التحويل من XML إلى JSON. استخدِم المجموعة <Options> التي تتيح لك إضافة إعدادات إحالات ناجحة معيّنة، أو العنصر <Format> الذي يتيح لك الإشارة إلى نموذج يتضمّن خيارات محدّدة مسبقًا. لا يمكنك استخدام كل من <Options> و<Format>.

السمة <Options> مطلوبة في حال عدم استخدام السمة <Format>.

العنصر <Options>/<RecognizeNumber>

إذا كانت القيمة صحيحة، ستحتفظ حقول الأرقام في حمولة 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"
    }
}
تلقائي خطأ
التواجد اختياري
النوع منطقي

العنصر <Options>/<RecognizeBoolean>

تتيح هذه السمة للإحالة الناجحة الاحتفاظ بالقيم المنطقية "صحيح" أو "خطأ" بدلاً من تحويل القيم إلى سلاسل.

<RecognizeBoolean>true</RecognizeBoolean>

في مثال XML التالي:

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

إذا كانت القيمة true، يتم التحويل إلى:

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

إذا كانت القيمة false، يتم التحويل إلى:

{
    "a": {
        "b": "true",
        "c": "value"
    }
}
تلقائي خطأ
التواجد اختياري
النوع منطقي

العنصر <Options>/<RecognizeNull>

تتيح لك تحويل القيم الفارغة إلى قيم فارغة.

<RecognizeNull>true</RecognizeNull>

بالنسبة إلى XML التالي:

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

إذا كانت القيمة true، يتم التحويل إلى:

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

إذا كانت القيمة false، يتم التحويل إلى:

{
  "a": {
    "b": {},
    "c": "value"
  }
}
تلقائي خطأ
التواجد اختياري
النوع منطقي

العنصر <Options>/<NullValue>

تشير إلى القيمة التي يجب تحويل قيم Null المعروفة في الرسالة المصدر إليها. القيمة التلقائية هي null. لن يكون لهذا الخيار أي تأثير إلا إذا كانت قيمة RecognizeNull هي "صحيح".

<NullValue>not-present</NullValue>

تلقائي null
التواجد اختياري
النوع سلسلة

عناصر <Options>/<NamespaceBlockName>
<Options>/<DefaultNamespaceNodeName>
<Options>/<NamespaceSeparator>

استخدِم هذه العناصر معًا.

<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>، يجب أيضًا تحديد العنصرَين الآخرَين.
النوع السلاسل

عناصر <Options>/<TextAlwaysAsProperty>
<Options>/<TextNodeName>

استخدِم هذه العناصر معًا.

إذا تم ضبطها على 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>: false
<TextNodeName>: N/A
التواجد اختياري
النوع <TextAlwaysAsProperty>: قيمة منطقية
<TextNodeName>: سلسلة

عناصر <Options>/<AttributeBlockName>
<Options>/<AttributePrefix>

استخدِم هذه العناصر معًا.

تتيح لك تجميع القيم في حزمة 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"
    }
}
تلقائي راجِع الأمثلة أعلاه.
التواجد اختياري
النوع سلسلة

عناصر <Options>/<OutputPrefix>
<Options>/<OutputSuffix>

استخدِم هذه العناصر معًا.

<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"
}
تلقائي راجِع العيّنات أعلاه.
التواجد اختياري
النوع سلسلة

العنصر <Options>/<StripLevels>

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

إذا أردت إزالة المستويات الأربعة الأولى في استجابة 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> (إزالة المستويات الثلاثة الأولى)، سيظهر ملف 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 (بدون إزالة أي مستوى)
التواجد اختياري
النوع عدد صحيح

العنصر <Options>/<TreatAsArray>/<Path>

<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"
              ]}
           }
      }
}

لاحظ أنّه تم وضع اسمَي الطالبَين في مصفوفة.

ومع ذلك، إذا ظهر طالب واحد فقط في مستند 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، التي سيتم شرحها في القسم التالي.

تلقائي غير متاح
التواجد اختياري
النوع سلسلة

السمات

 <Options>
    <TreatAsArray>
        <Path unwrap="true">teachers/teacher/studentnames/name</Path>
    </TreatAsArray>
</Options>
السمة الوصف التواجد في المنزل النوع
فك الترميز

القيمة التلقائية: false

تؤدي هذه السمة إلى إزالة العنصر من ناتج 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>، سيتم التعامل مع كلا العنصرَين في المسار على أنّهما مصفوفتان في ناتج JSON.

اختياري منطقي

للاطّلاع على المزيد من الأمثلة وشرح الميزة، راجِع مقالة "منتدى Apigee" هذه: Community tutorial: The TreatAsArray option in the XML to JSON policy.

<Format>

يمنحك التنسيق التحكّم في عملية التحويل من 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، فسيفشل نشر الخادم الوكيل لواجهة برمجة التطبيقات.
UnknownFormat إذا كان العنصر <Format> في سياسة XML إلى JSON يتضمّن قيمة غير معروفة المحدد، فسيفشل نشر الخادم الوكيل لواجهة برمجة التطبيقات. تتضمن التنسيقات المحددة مسبقًا ما يلي: "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