XMLtoJSON নীতি

আপনি Apigee Edge ডকুমেন্টেশন দেখছেন।
Apigee X ডকুমেন্টেশন দেখুন।
তথ্য

কী

এই নীতি এক্সটেনসিবল মার্ক-আপ ল্যাঙ্গুয়েজ (XML) ফর্ম্যাট থেকে মেসেজকে জাভাস্ক্রিপ্ট অবজেক্ট নোটেশন (JSON)-এ কনভার্ট করে, এর ফলে মেসেজ কীভাবে কনভার্ট করা হবে তা নিয়ন্ত্রণ করার জন্য আপনি একাধিক বিকল্প পাবেন।

যদি ধরে নেওয়া হয় যে XML-ফর্ম্যাট করা উত্তরকে JSON-ফর্ম্যাট করা উত্তরে পরিবর্তন করার উদ্দেশ্য রয়েছে, তাহলে নীতিটি একটি উত্তর ফ্লোতে (যেমন, উত্তর / ProxyEndpoint / PostFlow) অ্যাটাচ করা হবে।

সম্পর্কে

সাধারণত মধ্যস্থতা সংক্রান্ত পরিস্থিতিতে, ইনবাউন্ড অনুরোধ ফ্লোতে JSON থেকে XML নীতি প্রায়ই আউটবাউন্ড উত্তর ফ্লোতে XML থেকে JSON নীতির সাথে পেয়ার করা হয়। এইভাবে নীতি একত্রিত করার মাধ্যমে, JSON API-কে ব্যাক-এন্ড পরিষেবার জন্য এক্সপোজ করা যেতে পারে যা নেটিভভাবে শুধুমাত্র XML-এ কাজ করে।

যেসব পরিস্থিতিতে বিভিন্ন ক্লায়েন্ট অ্যাপ API ব্যবহার করে, যেগুলির JSON বা XML প্রয়োজন হতে পারে, সেখানে শর্তসাপেক্ষে চালানোর জন্য JSON থেকে XML এবং XML থেকে JSON নীতি কনফিগার করে, রেসপন্স ফর্ম্যাট ডায়নামিক সেট করা যেতে পারে। এই পরিস্থিতি প্রয়োগ করার জন্য ফ্লো ভেরিয়েবল ও কন্ডিশন দেখুন।


নমুনা

JSON ও XML-এর মধ্যে কনভার্ট করা নিয়ে বিস্তারিত আলোচনা পেতে, Apigee-এর মাধ্যমে XML ও JSON-এর মধ্যে কনভার্ট করা: আপনার যা জানা প্রয়োজন দেখুন।

উত্তর কনভার্ট করা

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

এই কনফিগারেশন—যা XML থেকে JSON-এ কনভার্ট করার জন্য প্রয়োজনীয় ন্যূনতম কনফিগারেশন— সোর্স হিসেবে XML-ফর্ম্যাটেড রেসপন্স মেসেজ নেয় এবং তারপর response OutputVariable-এ পপুলেট করা JSON-ফর্ম্যাটেড মেসেজ তৈরি করে। 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 অক্ষরের বেশি হতে পারে না।

ঐচ্ছিকভাবে, ম্যানেজমেন্ট UI প্রক্সি এডিটরে নীতিটিকে একটি ভিন্ন, প্রাকৃতিক-ভাষা নামের সাথে লেবেল করতে <DisplayName> উপাদানটি ব্যবহার করুন।

N/A প্রয়োজন
continueOnError

একটি নীতি ব্যর্থ হলে একটি ত্রুটি ফেরত দিতে false সেট করুন৷ এটি বেশিরভাগ নীতির জন্য প্রত্যাশিত আচরণ।

একটি নীতি ব্যর্থ হওয়ার পরেও ফ্লো এক্সিকিউশন চালিয়ে যেতে true সেট করুন৷

মিথ্যা ঐচ্ছিক
enabled

নীতি প্রয়োগ করতে true সেট করুন৷

নীতি বন্ধ করতে false সেট করুন। নীতিটি প্রবাহের সাথে সংযুক্ত থাকলেও তা কার্যকর করা হবে না।

সত্য ঐচ্ছিক
async

এই বৈশিষ্ট্যটি অবমূল্যায়ন করা হয়েছে৷

মিথ্যা অবচয়

<DisplayName> উপাদান

ম্যানেজমেন্ট UI প্রক্সি এডিটরে নীতিটিকে একটি ভিন্ন, প্রাকৃতিক-ভাষা নামের সাথে লেবেল করতে name বৈশিষ্ট্য ছাড়াও ব্যবহার করুন।

<DisplayName>Policy Display Name</DisplayName>
ডিফল্ট

N/A

আপনি এই উপাদানটি বাদ দিলে, নীতির name বৈশিষ্ট্যের মান ব্যবহার করা হবে।

উপস্থিতি ঐচ্ছিক
টাইপ স্ট্রিং

<Source> এলিমেন্ট

ভেরিয়েবল, অনুরোধ বা উত্তর, যাতে XML মেসেজ থাকে যা আপনি JSON-এ কনভার্ট করতে চান।

সোর্স মেসেজের HTTP কন্টেন্ট-টাইপ হেডারকে অবশ্যই application/xml হিসেবে সেট করতে হবে, তা না হলে নীতি প্রয়োগ করা যাবে না।

<Source> সংজ্ঞায়িত করা না থাকলে, এটিকে মেসেজ হিসেবে গণ্য করা হয় (যা কোনও অনুরোধ ফ্লোতে নীতি অ্যাটাচ করা থাকলে অনুরোধ হিসেবে সমাধান হয় অথবা কোনও উত্তর ফ্লোতে নীতি অ্যাটাচ করা থাকলে উত্তর হিসেবে সমাধান হয়)।

সোর্স ভেরিয়েবল সমাধান করা না গেলে অথবা মেসেজ নয় এমন কোনও ধরনের সাথে সমাধান করা হলে, নীতি একটি সমস্যা দেখায়।

<Source>response</Source>
ডিফল্ট অনুরোধ বা উত্তর, API প্রক্সি ফ্লোতে নীতি কোথায় যোগ করা হয়েছে তার উপর নির্ভর করে
উপস্থিতি ঐচ্ছিক
টাইপ করুন মেসেজ

<OutputVariable> এলিমেন্ট

XML থেকে JSON ফর্ম্যাটে কনভার্সন করা আউটপুট সেভ করে। এটি সাধারণত সোর্সের মতোই একই ভ্যালু হয়, অর্থাৎ, সাধারণত XML রেসপন্সকে JSON রেসপন্সে কনভার্ট করা হয়।

XML মেসেজের পেলোড পার্স করে JSON-এ কনভার্ট করা হয় এবং XML-ফর্ম্যাট করা মেসেজের HTTP Content-type হেডার application/json হিসেবে সেট করা হয়।

OutputVariable উল্লেখ করা না থাকলে, source-কে OutputVariable হিসেবে বিবেচনা করা হয়। যেমন, source-এর মান response হলে, OutputVariable-এর ডিফল্ট মান response হবে।

<OutputVariable>response</OutputVariable>
ডিফল্ট অনুরোধ বা উত্তর, API প্রক্সি ফ্লোতে নীতি কোথায় যোগ করা হয়েছে তার উপর নির্ভর করে
উপস্থিতি <Source> এলিমেন্টে সংজ্ঞায়িত ভেরিয়েবল স্ট্রিং ধরনের হলে এই এলিমেন্টটি বাধ্যতামূলক।
টাইপ করুন মেসেজ

<Options>

বিকল্পগুলি আপনাকে XML থেকে JSON-এ কনভার্সনের উপর নিয়ন্ত্রণ দেয়। আপনি <Options> গ্রুপ ব্যবহার করতে পারেন, যা আপনাকে নির্দিষ্ট কনভার্সন সেটিংস যোগ করতে দেয় অথবা <Format> এলিমেন্ট ব্যবহার করতে পারেন, যা আপনাকে আগে থেকে নির্ধারিত বিকল্পের টেমপ্লেট রেফারেন্স করতে দেয়। আপনি <Options> ও <Format>, দুটিই ব্যবহার করতে পারবেন না।

<Format> ব্যবহার করা না হলে <Options> প্রয়োজন।

<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> এলিমেন্ট

কনভার্সন, ভ্যালুকে স্ট্রিংয়ে পরিবর্তন না করে, বুলিয়ান 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"
    }
}
ডিফল্ট মিথ্যা
উপস্থিতি ঐচ্ছিক
টাইপ করুন বুলিয়ান

<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। 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>: প্রযোজ্য নয়
উপস্থিতি ঐচ্ছিক
টাইপ করুন <TextAlwaysAsProperty>: Boolean
<TextNodeName>: String

<Options>/<AttributeBlockName>
<Options>/<AttributePrefix> এলিমেন্ট

এইসব এলিমেন্ট একসাথে ব্যবহার করুন।

আপনাকে JSON ব্লকে ভ্যালু গ্রুপ করতে এবং অ্যাট্রিবিউট নামের সাথে প্রিফিক্স যোগ করতে দেয়।

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

নিচের XML উদাহরণটি দেখুন:

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

XML থেকে JSON-এর উদাহরণে যেভাবে উল্লেখ করা হয়েছে, সেইভাবে দুটি অ্যাট্রিবিউটই (AttributeBlockName এবং AttributePrefix) নির্দিষ্ট করা থাকলে, নিম্নলিখিত 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>

XML থেকে JSON-এর উদাহরণে যেভাবে উল্লেখ করা হয়েছে, সেইভাবে দুটি অ্যাট্রিবিউট (OutputPrefix এবং OutputSuffix) নির্দিষ্ট করা থাকলে নিচে দেখানো 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>

কখনও কখনও SOAP-এর মতো XML পেলোডের অনেক প্যারেন্ট লেভেল থাকে যা আপনি কনভার্ট করা 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>

আপনি রাজ্য, শহর, বিবরণ ও তাপমাত্রা লেভেলে পৌঁছানোর আগে ৪টি লেভেল আছে। <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
                        }  ...

এই উদাহরণে লেভেল ৩ হল 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
            }  ...

যেহেতু লেভেল ৪ হল প্রথম লেভেল যেখানে একাধিক সন্তান আছে, তাই আপনি এর থেকে কম লেভেল বাদ দিতে পারবেন না। আপনি স্ট্রিপ লেভেল ৫, ৬, ৭ ইত্যাদি হিসেবে সেট করলে, উপরে উল্লিখিত উত্তরটি আপনি পেতে থাকবেন।

ডিফল্ট ০ (কোনও লেভেল স্ট্রিপিং নেই)
উপস্থিতি ঐচ্ছিক
টাইপ করুন পূর্ণসংখ্যা

<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 এখন একটি অ্যারেতে আছে। এখন, একজন বা একাধিক শিক্ষার্থী থাকুক না কেন, আপনি নিম্নলিখিত JSONPath ব্যবহার করে আপনার কোডে JSON অ্যারে থেকে তাদের রিট্রিভ করতে পারবেন: $.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 কমিউনিটি নিবন্ধ দেখুন: কমিউনিটি টিউটোরিয়াল: XML থেকে JSON নীতিতে TreatAsArray বিকল্প।

<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 JSON নীতির XML-এর <Source> এলিমেন্টে নির্দিষ্ট করা ভেরিয়েবলটি যদি স্ট্রিং টাইপের হয় এবং <OutputVariable> এলিমেন্টটি যদি সংজ্ঞায়িত করা না থাকে, তাহলে এই সমস্যাটি হয়। <Source> এলিমেন্টে সংজ্ঞায়িত ভেরিয়েবলটি স্ট্রিং ধরনের হলে, <OutputVariable> এলিমেন্টটি বাধ্যতামূলক।
steps.xmltojson.SourceUnavailable 500 XML থেকে JSON নীতিতে <Source> এলিমেন্টে নির্দিষ্ট করা মেসেজ ভেরিয়েবলটি যদি:
  • স্কোপের বাইরে (যে নির্দিষ্ট ফ্লোতে নীতি প্রয়োগ করা হচ্ছে সেখানে উপলভ্য নয়) অথবা
  • সমাধান করা যাচ্ছে না (সংজ্ঞায়িত করা হয়নি)

ডিপ্লয়মেন্ট সংক্রান্ত সমস্যা

এই নীতি থাকা কোনও প্রক্সি আপনি প্রয়োগ করলে, এই সমস্যা হতে পারে।

সমস্যার নাম কারণ এর সমাধান করুন
EitherOptionOrFormat XML থেকে JSON নীতিতে <Options> বা <Format> এলিমেন্টগুলির মধ্যে একটিও ঘোষণা করা না থাকলে, API প্রক্সি ডিপ্লয় করা যায় না।
UnknownFormat XML থেকে JSON নীতিতে <Format> এলিমেন্টের মধ্যে কোনও অজানা ফর্ম্যাট নির্দিষ্ট করা থাকলে, 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 নীতি