JSON Pointer এবং JSONPath উভয়ই একটি JSON ডকুমেন্টের মধ্যে অবস্থানগুলিকে সম্বোধন করে, এবং
উভয়ই একই ধরনের সরঞ্জামগুলিতে দেখা যায়: JSON Schema-ত $ref, PATCH
অপারেশন, পথ-ভিত্তিক পার্থক্য। তারা ভিন্ন সমস্যা সমাধান করে, এবং জানা
কোনটি একটি নির্দিষ্ট কাজের প্রকৃত প্রয়োজন ভুল সরঞ্জাম বাছাই করা এড়ায়।
JSON Pointer: একটি অবস্থান, RFC 6901
একটি pointer / দ্বারা আলাদা করা টোকেনের একটি ক্রম: /user/name মানে হলো
user অবজেক্টের ভেতরে name কী, /items/0 মানে হলো items
অ্যারের প্রথম এলিমেন্ট। একটি টোকেনের ভেতরে দুটি অক্ষর এস্কেপ করার প্রয়োজন (~1 একটি
literal / এর জন্য, ~0 একটি literal ~ এর জন্য), এবং পুরো ডকুমেন্টের
খালি স্ট্রিং pointer হিসাবে। এটিই পুরো ব্যাকরণ। একটি pointer ঠিক
একটি মানে সমাধান করে, বা ব্যর্থ হয়, মাঝখানে কিছু নেই: কোনো ওয়াইল্ডকার্ড নেই,
কোনো ফিল্টার নেই, একাধিক অবস্থানের সাথে মিলিত হওয়ার কোনো উপায় নেই।
{ "user": { "name": "Ada", "roles": ["admin", "editor"] } }
/user/name "Ada"-এ সমাধান করে। /user/roles/1 "editor"-এ সমাধান করে।
/user/email ব্যর্থ হয়, কারণ সেই কীটি বিদ্যমান নেই। Pointer
বাক্যবিন্যাসে কিছুই একটি অভিব্যক্তিতে “প্রতিটি ভূমিকা” চাইতে পারে না; কলার
ইতিমধ্যে ইনডেক্স জানতে হবে।
JSONPath: একটি কোয়েরি ভাষা
JSONPath, RFC 9535 হিসাবে স্ট্যান্ডার্ডাইজড, মিলিত হওয়ার জন্য তৈরি, শুধুমাত্র
সম্বোধন করার জন্য নয়। $.user.roles[*] উপরের উদাহরণে একটি কোয়েরিতে উভয় ভূমিকা
ফিরিয়ে দেয়। $..email ডকুমেন্টের প্রতিটি স্তরে email নামের যেকোনো কী খুঁজে বের করে,
যত গভীরে নেস্টেড হোক না কেন। ফিল্টার অভিব্যক্তি যেমন
$.items[?(@.price > 100)] তাদের নিজস্ব বিষয়বস্তুর উপর শর্ত দ্বারা অ্যারে এলিমেন্ট নির্বাচন করে। একটি JSONPath কোয়েরি শূন্য মিল, এক, বা অনেক ফিরিয়ে দিতে পারে, যা
একটি pointer-এর সমাধান-বা-ব্যর্থ চুক্তি থেকে মৌলিকভাবে ভিন্ন।
ব্যবহারিক পার্থক্য
একটি pointer এমন একটি অবস্থানের নাম দেয় যা আপনি ইতিমধ্যে জানেন। একটি JSONPath কোয়েরি একটি শর্তের বর্ণনা দেয় এবং ইঞ্জিনকে সেটি সন্তুষ্ট করে এমন কিছু খুঁজে পেতে দেয়। সেই পার্থক্য নির্ধারণ করে কোনটি একটি নির্দিষ্ট কাজের জন্য উপযুক্ত:
- আপনি ইতিমধ্যে জানেন ঠিক কোন মান আপনি চান (“শিপিং ঠিকানা অ্যারের তৃতীয় এলিমেন্ট”): একটি pointer ব্যবহার করুন। এটি সরল, প্রতি ডকুমেন্ট একটি অস্পষ্ট অর্থ আছে, এবং প্রতিটি বাস্তবায়ন একমত যে এটি কী করে, কারণ RFC বোলি পার্থক্যের জন্য খুব কম জায়গা রাখে।
- আপনি এমন মান খুঁজছেন যা একটি শর্তের সাথে মিলে যায়, অথবা আপনি আগে থেকে
সঠিক পথ জানেন না (“প্রতিটি অবজেক্ট যার
statusfailed, যেখানেই এটি আবির্ভূত হোক”): JSONPath-এর দিকে যান। এখানেই বোলি পার্থক্য গুরুত্বপূর্ণ হতে শুরু করে: JSONPath বাস্তবায়ন RFC 9535-এর নিজস্ব উদাহরণের চেয়ে বেশি ভিন্ন, তাই একটি লাইব্রেরির জন্য লেখা একটি কোয়েরি অন্য একটিতে একই আচরণের গ্যারান্টি নেই।
ব্যবহারে কোথায় দেখা যায়
JSON Patch (RFC 6902) অপারেশন বিশেষভাবে pointers ব্যবহার করে; add, remove, replace বা move অপারেশনে প্রতিটি "path" একটি JSON Pointer,
কারণ একটি patch অপারেশন নকশা অনুযায়ী একটি নির্দিষ্ট অবস্থানকে লক্ষ্য করে। JSON
Schema-র $ref কীও pointer বাক্যবিন্যাসের মাধ্যমে সমাধান করে, একই
কারণে: একটি স্কিমা রেফারেন্স একটি সংজ্ঞার দিকে নির্দেশ করে, সেগুলির একটি সেটের দিকে নয়।
JSONPath তখন দেখা যায় যখন কোনো ব্যক্তি বা সরঞ্জামকে ইন্টারঅ্যাক্টিভভাবে একটি ডকুমেন্ট
কোয়েরি করার প্রয়োজন হয়: একটি বড় API প্রতিক্রিয়া ডিবাগ করা, লগ থেকে একটি ফিল্ড
বের করা, অথবা একটি নিয়ম তৈরি করা যা দেওয়া আকৃতির যেকোনো ডকুমেন্টের সাথে মিলিত হবে
সংশ্লিষ্ট ফিল্ড ঠিক কোথায় বসেছে তার নির্ভর করে না।
উভয়ই চেষ্টা করুন
JSON Pointer Evaluator একটি ডকুমেন্টের বিরুদ্ধে একটি pointer সমাধান করে এবং, একটি ব্যর্থ লুকআপে, রিপোর্ট করে এটি কতটুকু এগিয়ে গেছে এবং সেই বিন্দুতে প্রকৃতপক্ষে কোন কীগুলি বিদ্যমান, একটি খালি “পাওয়া যায়নি”-এর পরিবর্তে। JSONPath Tester RFC 9535-এর ডকুমেন্টেড সাবসেট ফাংশন এক্সটেনশন সহ চালায়, এবং এই সাইটের ব্লগে JSONPath চিট শিট-এ প্রতিটি সিলেক্টরের জন্য একটি কার্যশীল উদাহরণ আছে যা জানার যোগ্য। JSON Pointer কীভাবে ব্যবহার করবেন pointer বাক্যবিন্যাসকে আরও গভীরভাবে কভার করে, এস্কেপ সহ।