আপনি Apigee Edge-এর ডকুমেন্টেশন দেখছেন।
Apigee X ডকুমেন্টেশন .info- তে যান।
কী
এই পলিসি মেসেজগুলোকে এক্সটেনসিবল মার্কআপ ল্যাঙ্গুয়েজ (XML) ফরম্যাট থেকে জাভাস্ক্রিপ্ট অবজেক্ট নোটেশন (JSON)-এ রূপান্তর করে এবং মেসেজগুলো কীভাবে রূপান্তরিত হবে তা নিয়ন্ত্রণ করার জন্য আপনাকে বিভিন্ন বিকল্প প্রদান করে।
যদি XML-ফরম্যাটের রেসপন্সকে JSON-ফরম্যাটের রেসপন্সে রূপান্তর করার উদ্দেশ্য থাকে, তাহলে পলিসিটি একটি রেসপন্স ফ্লো-এর (যেমন, Response / ProxyEndpoint / PostFlow) সাথে সংযুক্ত করা হবে।
সম্পর্কে
একটি সাধারণ মিডিয়েশন পরিস্থিতিতে, ইনবাউন্ড রিকোয়েস্ট ফ্লো-এর জন্য একটি JSON থেকে XML পলিসির সাথে প্রায়শই আউটবাউন্ড রেসপন্স ফ্লো-এর জন্য একটি XML থেকে JSON পলিসি যুক্ত করা হয়। এভাবে পলিসিগুলোকে একত্রিত করার মাধ্যমে, সেইসব ব্যাকএন্ড সার্ভিসের জন্য একটি JSON API উন্মুক্ত করা যায়, যেগুলো স্বাভাবিকভাবে শুধু XML সমর্থন করে।
যেসব ক্ষেত্রে বিভিন্ন ক্লায়েন্ট অ্যাপ এপিআই ব্যবহার করে এবং সেগুলোর জন্য JSON বা XML উভয়েরই প্রয়োজন হতে পারে, সেখানে শর্তসাপেক্ষে কার্যকর করার জন্য JSON to XML এবং XML to JSON পলিসি কনফিগার করার মাধ্যমে রেসপন্স ফরম্যাটটি ডায়নামিকভাবে সেট করা যেতে পারে। এই সিনারিওটির বাস্তবায়নের জন্য ফ্লো ভ্যারিয়েবল এবং কন্ডিশন দেখুন।
নমুনা
JSON এবং XML-এর মধ্যে রূপান্তর সম্পর্কে বিস্তারিত আলোচনার জন্য, “Apigee-এর সাহায্যে XML এবং JSON-এর মধ্যে রূপান্তর: আপনার যা জানা প্রয়োজন” দেখুন।
একটি প্রতিক্রিয়া রূপান্তর করা
<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 | নীতির অভ্যন্তরীণ নাম। ঐচ্ছিকভাবে, ম্যানেজমেন্ট UI প্রক্সি এডিটরে নীতিটিকে একটি ভিন্ন, প্রাকৃতিক-ভাষা নামের সাথে লেবেল করতে | N/A | প্রয়োজন |
continueOnError | একটি নীতি ব্যর্থ হলে একটি ত্রুটি ফেরত দিতে একটি নীতি ব্যর্থ হওয়ার পরেও ফ্লো এক্সিকিউশন চালিয়ে যেতে | মিথ্যা | ঐচ্ছিক |
enabled | নীতি প্রয়োগ করতে নীতি বন্ধ করতে | সত্য | ঐচ্ছিক |
async | এই বৈশিষ্ট্যটি অবমূল্যায়ন করা হয়েছে৷ | মিথ্যা | অবচয় |
<DisplayName> উপাদান
ম্যানেজমেন্ট UI প্রক্সি এডিটরে নীতিটিকে একটি ভিন্ন, প্রাকৃতিক-ভাষা নামের সাথে লেবেল করতে name বৈশিষ্ট্য ছাড়াও ব্যবহার করুন।
<DisplayName>Policy Display Name</DisplayName>
| ডিফল্ট | N/A আপনি এই উপাদানটি বাদ দিলে, নীতির |
|---|---|
| উপস্থিতি | ঐচ্ছিক |
| টাইপ | স্ট্রিং |
<উৎস> উপাদান
রিকোয়েস্ট বা রেসপন্স ভেরিয়েবল, যেটিতে সেই XML মেসেজটি রয়েছে যা আপনি JSON-এ রূপান্তর করতে চান।
উৎস বার্তার HTTP Content-type হেডার অবশ্যই application/xml এ সেট করতে হবে, অন্যথায় নীতিটি কার্যকর হবে না।
যদি <Source> সংজ্ঞায়িত না থাকে, তাহলে এটিকে একটি বার্তা হিসেবে গণ্য করা হয় (যা পলিসিটি কোনো অনুরোধ প্রবাহের (request flow) সাথে সংযুক্ত থাকলে অনুরোধে (request) অথবা পলিসিটি কোনো প্রতিক্রিয়া প্রবাহের (response flow) সাথে সংযুক্ত থাকলে প্রতিক্রিয়ায় (response) রূপান্তরিত হয়)।
যদি সোর্স ভেরিয়েবলটি রিজলভ করা না যায়, অথবা এটি কোনো নন-মেসেজ টাইপে রিজলভ হয়, তাহলে পলিসিটি একটি এরর থ্রো করে।
<Source>response</Source>
| ডিফল্ট | অনুরোধ বা প্রতিক্রিয়া, যা এপিআই প্রক্সি ফ্লোতে পলিসিটি কোথায় যুক্ত করা হয়েছে তার উপর নির্ভর করে নির্ধারিত হয়। |
| উপস্থিতি | ঐচ্ছিক |
| প্রকার | বার্তা |
<আউটপুট ভেরিয়েবল> উপাদান
XML থেকে JSON ফরম্যাটে রূপান্তরের আউটপুট সংরক্ষণ করে। এটি সাধারণত উৎসের মানের সমান হয়, অর্থাৎ, সাধারণত XML প্রতিক্রিয়াকে JSON প্রতিক্রিয়াতে রূপান্তরিত করা হয়।
XML বার্তার পেলোড পার্স করে JSON-এ রূপান্তর করা হয় এবং XML-ফরম্যাট করা বার্তাটির HTTP Content-type হেডারটি application/json এ সেট করা হয়।
যদি OutputVariable নির্দিষ্ট করা না থাকে, তাহলে source OutputVariable হিসেবে গণ্য করা হয়। উদাহরণস্বরূপ, যদি source response হয়, তাহলে OutputVariable ডিফল্টভাবে response এ সেট হয়ে যায়।
<OutputVariable>response</OutputVariable>
| ডিফল্ট | অনুরোধ বা প্রতিক্রিয়া, যা এপিআই প্রক্সি ফ্লোতে পলিসিটি কোথায় যুক্ত করা হয়েছে তার উপর নির্ভর করে নির্ধারিত হয়। |
| উপস্থিতি | <Source> এলিমেন্টে সংজ্ঞায়িত ভেরিয়েবলটি স্ট্রিং টাইপের হলে এই এলিমেন্টটি বাধ্যতামূলক। |
| প্রকার | বার্তা |
<বিকল্পসমূহ>
অপশনগুলো আপনাকে 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> এলিমেন্ট
রূপান্তরটি মানগুলিকে স্ট্রিং-এ পরিণত না করে বুলিয়ান ট্রু/ফলস মান বজায় রাখে।
<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> এলিমেন্ট
এটি আপনাকে খালি মানগুলিকে নাল (null) মানে রূপান্তর করতে দেয়।
<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 ট্রু (true) হয়।
<NullValue>not-present</NullValue>
| ডিফল্ট | null |
| উপস্থিতি | ঐচ্ছিক |
| প্রকার | স্ট্রিং |
<বিকল্পসমূহ>/<নেমস্পেসব্লকনাম>
<বিকল্পসমূহ>/<ডিফল্ট নেমস্পেস নোডের নাম>
<বিকল্প>/<নামস্থানবিভাজক> উপাদান
এই উপাদানগুলো একসাথে ব্যবহার করুন।
<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> উল্লেখ করেন, তাহলে আপনাকে অবশ্যই অন্য দুটি উপাদানও উল্লেখ করতে হবে। |
| প্রকার | স্ট্রিং |
<বিকল্পসমূহ>/<টেক্সট সর্বদা প্রপার্টি হিসাবে>
<বিকল্প>/<টেক্সটনোডনাম> উপাদান
এই উপাদানগুলো একসাথে ব্যবহার করুন।
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> : স্ট্রিং |
<বিকল্পসমূহ>/<অ্যাট্রিবিউটব্লকনাম>
<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"
}
}| ডিফল্ট | উপরের উদাহরণগুলো দেখুন। |
| উপস্থিতি | ঐচ্ছিক |
| প্রকার | স্ট্রিং |
<বিকল্পসমূহ>/<আউটপুট প্রিফিক্স>
<বিকল্প>/<আউটপুটসাফিক্স> উপাদান
এই উপাদানগুলো একসাথে ব্যবহার করুন।
<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>কখনও কখনও 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>
রাজ্য, শহর, বিবরণ এবং তাপমাত্রা স্তরে পৌঁছানোর আগে ৪টি স্তর রয়েছে। <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 to 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 to JSON পলিসি স্বয়ংক্রিয়ভাবে মানটিকে স্ট্রিং-এর অ্যারে হিসেবে নয়, বরং একটি একক স্ট্রিং হিসেবে গণ্য করে, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:
{
"teachers" : {
"teacher" : {
"name" : "teacherA",
"studentnames" : {
"name" : "student1"
}
}
}
}পূর্ববর্তী উদাহরণগুলিতে, একই ধরনের ডেটা ভিন্নভাবে রূপান্তরিত করা হয়েছিল, একবার অ্যারে হিসাবে, আরেকবার একটি একক স্ট্রিং হিসাবে। এখানেই <TreatAsArray>/<Path> এলিমেন্টটি আপনাকে আউটপুট নিয়ন্ত্রণ করতে দেয়। উদাহরণস্বরূপ, আপনি নিশ্চিত করতে পারেন যে ছাত্রের নামগুলি সর্বদা একটি অ্যারেতে রাখা হবে, এমনকি যদি সেখানে কেবল একটি মানও থাকে। আপনি যে এলিমেন্টের মানগুলি একটি অ্যারেতে রাখতে চান, তার 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>| বৈশিষ্ট্য | বর্ণনা | উপস্থিতি | প্রকার |
|---|---|---|---|
| মোড়ক খুলুন | ডিফল্ট: মিথ্যা JSON আউটপুট থেকে এলিমেন্টটি সরিয়ে দেয়। JSON-কে সুবিন্যস্ত বা ফ্ল্যাটেন ("আনর্যাপ") করতে এটি ব্যবহার করুন, যা ভ্যালু পুনরুদ্ধার করার জন্য প্রয়োজনীয় JSONPath-কেও ছোট করে। উদাহরণস্বরূপ, এখানে একটি JSON উদাহরণ দেওয়া হলো: {
"teachers" : {
"teacher" : {
"name" : "teacherA",
"studentnames" : {
"name" : [
"student1",
"student2"
]}...এই উদাহরণে, আপনি বলতে পারেন যে <TreatAsArray>
<Path unwrap="true">teachers/teacher</Path>
<Path unwrap="true">teachers/teacher/studentnames/name</Path>
</TreatAsArray>` {
"teachers" : [{
"name" : "teacherA",
"studentnames" : ["student1","student2"]
}]...উল্লেখ্য যে, যেহেতু | ঐচ্ছিক | বুলিয়ান |
আরও উদাহরণ এবং ফিচারের বিস্তারিত বিবরণের জন্য, Apigee কমিউনিটির এই আর্টিকেলটি দেখুন: কমিউনিটি টিউটোরিয়াল: XML to JSON পলিসিতে TreatAsArray অপশন ।
<ফরম্যাট>
ফরম্যাট আপনাকে XML থেকে JSON-এ রূপান্তরের উপর নিয়ন্ত্রণ দেয়। একটি পূর্বনির্ধারিত টেমপ্লেটের নাম লিখুন, যেটিতে এই টপিকে বর্ণিত Options এলিমেন্টগুলোর একটি নির্দিষ্ট সংমিশ্রণ রয়েছে। পূর্বনির্ধারিত ফরম্যাটগুলোর মধ্যে রয়েছে: xml.com , yahoo , google , badgerFish ।
হয় <Format> এলিমেন্ট অথবা <Options> গ্রুপ ব্যবহার করুন। আপনি <Format> এবং <Options> উভয়ই ব্যবহার করতে পারবেন না।
নিম্নলিখিতগুলি হল প্রতিটি পূর্বনির্ধারিত টেমপ্লেটের ফরম্যাট সংজ্ঞা।
এক্সএমএল.কম
<RecognizeNull>true</RecognizeNull> <TextNodeName>#text</TextNodeName> <AttributePrefix>@</AttributePrefix>
ইয়াহু
<RecognizeNumber>true</RecognizeNumber> <TextNodeName>content</TextNodeName>
গুগল
<TextNodeName>$t</TextNodeName> <NamespaceSeparator>$</NamespaceSeparator> <TextAlwaysAsProperty>true</TextAlwaysAsProperty>
ব্যাজারফিশ
<TextNodeName>$</TextNodeName> <TextAlwaysAsProperty>true</TextAlwaysAsProperty> <AttributePrefix>@</AttributePrefix> <NamespaceSeparator>:</NamespaceSeparator> <NamespaceBlockName>@xmlns</NamespaceBlockName> <DefaultNamespaceNodeName>$</DefaultNamespaceNodeName>
এলিমেন্ট সিনট্যাক্স:
<Format>yahoo</Format>
| ডিফল্ট | উপলব্ধ ফরম্যাটের নাম লিখুন:xml.com , yahoo , google , badgerFish |
| উপস্থিতি | <Options> ব্যবহার করা না হলে এটি আবশ্যক। |
| প্রকার | স্ট্রিং |
স্কিমা
ত্রুটির রেফারেন্স
এই বিভাগটি ফল্ট কোড এবং ত্রুটি বার্তাগুলি বর্ণনা করে যেগুলি ফেরত দেওয়া হয় এবং ত্রুটি ভেরিয়েবলগুলি যেগুলি এজ দ্বারা সেট করা হয় যখন এই নীতিটি একটি ত্রুটি ট্রিগার করে৷ এই তথ্যটি জানা গুরুত্বপূর্ণ যে আপনি ত্রুটিগুলি পরিচালনা করার জন্য ত্রুটির নিয়ম তৈরি করছেন কিনা। আরও জানতে, নীতিগত ত্রুটি এবং হ্যান্ডলিং ফল্ট সম্পর্কে আপনার যা জানা দরকার তা দেখুন৷
রানটাইম ত্রুটি
নীতি কার্যকর করার সময় এই ত্রুটিগুলি ঘটতে পারে৷
| ফল্ট কোড | HTTP স্থিতি | কারণ | ঠিক করুন |
|---|---|---|---|
steps.xmltojson.ExecutionFailed | 500 | এই ত্রুটিটি ঘটে যখন ইনপুট পেলোড (XML) খালি থাকে বা ইনপুট XML অবৈধ বা বিকৃত হয়। | build |
steps.xmltojson.InCompatibleType | 500 | এই ত্রুটিটি ঘটে যদি <Source> উপাদানে সংজ্ঞায়িত ভেরিয়েবলের ধরন এবং <OutputVariable> উপাদান একই না হয়। এটা বাধ্যতামূলক যে <Source> উপাদানের মধ্যে থাকা ভেরিয়েবলের ধরন এবং <OutputVariable> উপাদান মিলে যায়। | build |
steps.xmltojson.InvalidSourceType | 500 | এই ত্রুটিটি ঘটবে যদি <Source> উপাদানটি সংজ্ঞায়িত করতে ব্যবহৃত ভেরিয়েবলের ধরনটি অবৈধ। ভেরিয়েবলের বৈধ প্রকারগুলি হল বার্তা এবং স্ট্রিং। | build |
steps.xmltojson.OutputVariableIsNotAvailable | 500 | XML থেকে JSON নীতির <Source> উপাদানে উল্লেখিত ভেরিয়েবল টাইপ স্ট্রিং এবং <OutputVariable> উপাদানটি সংজ্ঞায়িত না হলে এই ত্রুটি ঘটে। <OutputVariable> উপাদানটি বাধ্যতামূলক যখন <Source> এলিমেন্টে সংজ্ঞায়িত ভেরিয়েবল টাইপ স্ট্রিং হয়। | build |
steps.xmltojson.SourceUnavailable | 500 | এই ত্রুটিটি ঘটে যদি XML থেকে JSON নীতির <Source> উপাদানে নির্দিষ্ট করা বার্তা পরিবর্তনশীল হয়:
| build |
স্থাপনার ত্রুটি
আপনি যখন এই নীতি সম্বলিত একটি প্রক্সি স্থাপন করেন তখন এই ত্রুটিগুলি ঘটতে পারে৷
| ত্রুটির নাম | কারণ | ঠিক করুন |
|---|---|---|
EitherOptionOrFormat | যদি XML থেকে JSON নীতিতে <Options> বা <Format> উপাদানগুলির একটি ঘোষণা করা না হয়, তাহলে API প্রক্সির স্থাপনা ব্যর্থ হয়। | build |
UnknownFormat | যদি XML থেকে JSON নীতির মধ্যে <Format> উপাদানটির একটি অজানা বিন্যাস সংজ্ঞায়িত থাকে, তাহলে API প্রক্সির স্থাপনা ব্যর্থ হয়। পূর্বনির্ধারিত বিন্যাসগুলির মধ্যে রয়েছে: xml.com , yahoo , google , এবং badgerFish ৷ | build |
ফল্ট ভেরিয়েবল
রানটাইম ত্রুটি ঘটলে এই ভেরিয়েবলগুলি সেট করা হয়। আরও তথ্যের জন্য, নীতি ত্রুটি সম্পর্কে আপনার যা জানা দরকার তা দেখুন।
| ভেরিয়েবল | যেখানে | উদাহরণ |
|---|---|---|
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 নীতি