מדיניות XMLtoJSON

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

מה

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

בהנחה שהכוונה היא להמיר תגובה בפורמט 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 בהודעת המקור צריכה להיות מוגדרת ל-application/xml, אחרת המדיניות לא תיאכף.

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

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

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

רכיב <OutputVariable>

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

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

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

<OutputVariable>response</OutputVariable>
ברירת מחדל בקשה או תגובה, בהתאם למקום שבו המדיניות נוספת לזרימת ה-proxy ל-API
נוכחות האלמנט הזה הוא חובה כשהמשתנה שמוגדר באלמנט <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> elements

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

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

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

מאפשר לקבץ ערכים לבלוק 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 to 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 (מדריך לקהילה: האפשרות TreatAsArray במדיניות XML ל-JSON).

<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