מדיניות XMLtoJSON

אתם צופים במסמכי התיעוד של Apigee Edge.
אפשר לעבור אל מסמכי התיעוד של Apigee X.
מידע

מה

המדיניות הזו ממירה הודעות מפורמט XML (שפת תגי עיצוב ניתנת להרחבה) לפורמט JSON (JavaScript Object Notation). כך יש לכם כמה אפשרויות לשליטה באופן ההמרה של ההודעות.

אם הכוונה היא להמיר תגובה בפורמט XML לתגובה בפורמט JSON, המדיניות תצורף ל-Flow של תגובה (לדוגמה, Response / ProxyEndpoint / PostFlow).

מידע כללי

בתרחיש טיפוסי של גישור, מדיניות JSON ל-XML בזרימת הבקשות הנכנסות משולבת לעיתים קרובות עם מדיניות XML ל-JSON בזרימת התגובות היוצאות. באמצעות שילוב של כללי מדיניות בדרך הזו, אפשר לחשוף API בפורמט JSON לשירותי קצה עורפי שתומכים באופן טבעי רק ב-XML.

בתרחישים שבהם ממשקי API נצרכים על ידי אפליקציות לקוח מגוונות שעשויות לדרוש 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 שמאוכלסת ב-OutputVariable‏ response. ‫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> כדי להוסיף תווית למדיניות עורך ה-Proxy של ממשק המשתמש לניהול בעל שם אחר בשפה טבעית.

לא רלוונטי חובה
continueOnError

צריך להגדיר את הערך false כדי להחזיר שגיאה כשמדיניות נכשלת. המצב הזה צפוי של רוב כללי המדיניות.

יש להגדיר ל-true כדי שביצוע התהליך יימשך גם לאחר המדיניות נכשל.

false אופציונלי
enabled

צריך להגדיר את הערך true כדי לאכוף את המדיניות.

צריך להגדיר את הערך false כדי להשבית את המדיניות. המדיניות לא תהיה אכיפה גם אם היא ממשיכה להיות מחוברת לזרימה.

true אופציונלי
async

המאפיין הזה הוצא משימוש.

false הוצא משימוש

&lt;DisplayName&gt; רכיב

צריך להשתמש בנוסף למאפיין name כדי להוסיף תווית למדיניות עורך proxy של ממשק משתמש לניהול עם שם אחר בשפה טבעית.

<DisplayName>Policy Display Name</DisplayName>
ברירת מחדל

לא רלוונטי

אם משמיטים את הרכיב הזה, הערך של המאפיין name של המדיניות הוא בשימוש.

נוכחות אופציונלי
סוג מחרוזת

אלמנט <Source>

המשתנה, הבקשה או התגובה שמכילים את הודעת ה-XML שרוצים להמיר ל-JSON.

כותרת ה-HTTP Content-type של הודעת המקור צריכה להיות מוגדרת ל-application/xml, אחרת המדיניות לא נאכפת.

אם <Source> לא מוגדר, הוא נחשב כהודעה (שמפוענחת כבקשה כשהמדיניות מצורפת לזרימת בקשות, או כתגובה כשהמדיניות מצורפת לזרימת תגובות).

אם אי אפשר לפתור את משתנה המקור, או שהוא נפתר כסוג שאינו הודעה, המדיניות מציגה שגיאה.

<Source>response</Source>
ברירת מחדל בקשה או תגובה, בהתאם למקום שבו המדיניות נוספת לזרימת ה-API proxy
נוכחות אופציונלי
סוג הודעה

אלמנט <OutputVariable>

מאחסן את הפלט של ההמרה מפורמט XML לפורמט JSON. בדרך כלל זהו אותו ערך כמו המקור, כלומר, בדרך כלל תגובת XML מומרת לתגובת JSON.

המטען הייעודי (payload) של הודעת ה-XML מנותח ומומר ל-JSON, וכותרת ה-HTTP Content-type של ההודעה בפורמט XML מוגדרת ל-application/json.

אם לא מציינים את OutputVariable, המערכת מתייחסת אל source כאל OutputVariable. לדוגמה, אם הערך של source הוא response, ערך ברירת המחדל של OutputVariable יהיה response.

<OutputVariable>response</OutputVariable>
ברירת מחדל בקשה או תגובה, בהתאם למקום שבו המדיניות נוספת לזרימת ה-API proxy
נוכחות האלמנט הזה הוא חובה כשהמשתנה שמוגדר באלמנט <Source> הוא מסוג מחרוזת.
סוג הודעה

<Options>

האפשרויות מאפשרות לכם לשלוט בהמרה מ-XML ל-JSON. אפשר להשתמש בקבוצה <Options> כדי להוסיף הגדרות המרה ספציפיות, או ברכיב <Format> כדי להפנות לתבנית של אפשרויות מוגדרות מראש. אי אפשר להשתמש גם ב-<Options> וגם ב-<Format>.

חובה להשתמש ב-<Options> אם לא משתמשים ב-<Format>.

אלמנט <Options>/<RecognizeNumber>

אם הערך הוא true, שדות המספרים במטען ה-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"
    }
}
ברירת מחדל false
נוכחות אופציונלי
סוג בוליאני

אלמנט <Options>/<RecognizeBoolean>

ההגדרה מאפשרת להמרה לשמור על ערכים בוליאניים של true/false במקום להפוך את הערכים למחרוזות.

<RecognizeBoolean>true</RecognizeBoolean>

בדוגמת ה-XML הבאה:

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

אם true, ההמרה היא:

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

אם false, ההמרה היא:

{
    "a": {
        "b": "true",
        "c": "value"
    }
}
ברירת מחדל false
נוכחות אופציונלי
סוג בוליאני

אלמנט <Options>/<RecognizeNull>

מאפשרת להמיר ערכים ריקים לערכי null.

<RecognizeNull>true</RecognizeNull>

ב-XML הבא:

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

אם true, ההמרה היא:

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

אם false, ההמרה היא:

{
  "a": {
    "b": {},
    "c": "value"
  }
}
ברירת מחדל false
נוכחות אופציונלי
סוג בוליאני

אלמנט <Options>/<NullValue>

מציין את הערך שאליו צריך להמיר ערכי null שזוהו בהודעת המקור. ערך ברירת המחדל הוא null. האפשרות הזו רלוונטית רק אם המדיניות RecognizeNull מוגדרת כ-True.

<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>: Boolean
<TextNodeName>: String

‫<Options>/<AttributeBlockName>
‫<Options>/<AttributePrefix> elements

משתמשים ברכיבים האלה יחד.

מאפשר לקבץ ערכים לבלוק 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>

לפעמים, למטענים ייעודיים (payloads) של 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> (מסירים את שלוש הרמות הראשונות), קובץ ה-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. האפשרות הזו שימושית, למשל, כשמספר רכיבי הצאצא יכול להשתנות (מ-1 לכמה), ואתם רוצים לוודא שהערכים תמיד יהיו במערך. הפעולה הזו עוזרת לשמור על יציבות הקוד, כי אפשר לקבל נתונים מהמערך באותה דרך בכל פעם. לדוגמה: $.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>

‫...gets converted into the following JSON automatically with no special policy configuration:

{
  "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 והרכיב studentnames name מיותרים. לכן אפשר להסיר אותם או לבטל את העטיפה שלהם. כך מגדירים את הרכיב <Path> כדי לבצע את הפעולה הזו:

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

המאפיין unwrap מוגדר כ-true, והנתיבים לאלמנטים שצריך לבטל את העטיפה שלהם מסופקים. פלט ה-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. מזינים את השם של תבנית מוגדרת מראש שמכילה שילוב ספציפי של רכיבי Options שמתוארים בנושא הזה. הפורמטים המוגדרים מראש כוללים: 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 השגיאה הזו מתקבלת כשהמטען הייעודי (payload) של הקלט (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 הוא:
  • לא בהיקף (לא זמין בתהליך הספציפי שבו המדיניות מופעלת) או
  • לא ניתן לפתרון (לא מוגדר)

שגיאות פריסה

השגיאות האלו עשויות להתרחש כאשר פורסים שרת proxy שמכיל את המדיניות הזו.

שם השגיאה סיבה תיקון
EitherOptionOrFormat אם אחד מהרכיבים <Options> או <Format> אינו שהוצהרה במדיניות XML ל-JSON, הפריסה של שרת ה-proxy ל-API נכשלת.
UnknownFormat אם לרכיב <Format> במדיניות XML ל-JSON יש ערך לא ידוע מוגדר, פריסת שרת ה-proxy של ה-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