JSONPath হলো JSON-এর জন্য একটি কোয়েরি ভাষা, ঠিক যেমন XPath XML-এর জন্য। এটি Stefan Goessner দ্বারা 2007 সালে খসড়া তৈরি করা হয়েছিল, যাদের প্রয়োজন ছিল সবাই বিভিন্নভাবে বাস্তবায়ন করেছিল, এবং অবশেষে 2024 সালে RFC 9535 হিসাবে স্ট্যান্ডার্ডাইজড হয়েছিল। সেই ইতিহাসের কারণে দুটি JSONPath বাস্তবায়ন প্রায়ই অসম্মত, এবং একটি চিট শিট প্রতীকের তালিকা থেকে ফলাফল সহ বেশি উপযোগী।
নিচের প্রতিটি কোয়েরি এই ডকুমেন্টের বিরুদ্ধে চলে। আপনি এটি JSONPath টেস্টার-এ পেস্ট করতে পারেন, যা এটিকে ঠিক তার নমুনা হিসাবে লোড করে।
{
"store": {
"book": [
{ "category": "reference", "author": "Nigel Rees", "title": "Sayings of the Century", "price": 8.95 },
{ "category": "fiction", "author": "Evelyn Waugh", "title": "Sword of Honour", "price": 12.99 },
{ "category": "fiction", "author": "Herman Melville", "title": "Moby Dick", "isbn": "0-553-21311-3", "price": 8.99 }
],
"bicycle": { "color": "red", "price": 19.95 }
},
"expensive": 10
}
সিলেক্টর
রুট। $ হলো পুরো ডকুমেন্ট। প্রতিটি কোয়েরি সেখান থেকে শুরু হয়।
নাম দ্বারা চাইল্ড। $.store.bicycle.color "red" ফিরিয়ে দেয়। একটি ডট তারপর একটি নাম,
যত বার প্রয়োজন।
কোটেড নাম। $['store']['bicycle'] একই জিনিস অন্য ভাবে লেখা।
একটি কীতে স্পেস, ডট বা ড্যাশ থাকলে, অথবা
ডিজিট দিয়ে শুরু হলে ব্র্যাকেট প্রয়োজন: $['first name']।
ওয়াইল্ডকার্ড। $.store.bicycle.* "red" এবং 19.95 ফিরিয়ে দেয়, সেই অবজেক্টের
প্রতিটি চাইল্ড। $.store.book[*] তিনটি বই ফিরিয়ে দেয়।
ইনডেক্স। $.store.book[0] প্রথম বই। $.store.book[-1] শেষ
বই, শেষ থেকে গণনা করে।
স্লাইস। $.store.book[0:2] প্রথম দুটি বই ফিরিয়ে দেয়। শেষ
এক্সক্লুসিভ, ঠিক যেমন Python-এ। $.store.book[::2] প্রতি দ্বিতীয় বই নেয়,
এবং নেগেটিভ পদ উল্টে দেয়: $.store.book[::-1]।
ইউনিয়ন। $.store.book[0, 2] প্রথম এবং তৃতীয় বই ফিরিয়ে দেয়।
$.store.bicycle['color', 'price'] একসাথে দুটি নামকৃত চাইল্ড নির্বাচন করে।
ডিসেন্ডেন্ট। $..price যেকোনো গভীরতায় প্রতিটি মূল্য ফিরিয়ে দেয়, যা এখানে
8.95, 12.99, 8.99 এবং 19.95। এটিই সিলেক্টর যার দিকে মানুষ সবচেয়ে বেশি
ঝুঁকে এবং যা একটি বড় ডকুমেন্টে সবচেয়ে বেশি খরচ করে, কারণ এটি প্রতিটি
মান ভ্রমণ করে।
ফিল্টার। $.store.book[?@.price < 10] দুটি কম দামি বই ফিরিয়ে দেয়। @
পরীক্ষাধীন মানকে নির্দেশ করে। RFC 9535 পুরনো টিউটোরিয়ালে ব্যবহৃত
ব্র্যাকেট বাদ দিয়েছে, তাই [?@.price < 10] এবং [?(@.price < 10)] উভয়ই
প্রচলনে দেখা যায়। এখানকার টেস্টার উভয়ই গ্রহণ করে।
অস্তিত্ব। $.store.book[?@.isbn] শুধুমাত্র সেই বই ফিরিয়ে দেয় যার isbn
ফিল্ড আছে, কোনো কিছুর সাথে তুলনা করার ছাড়া।
পরীক্ষা সংযোজন। &&, || এবং ! আপনি যা আশা করবেন তেমনভাবে কাজ করে:
$..book[?@.category == 'fiction' && @.price < 10].title "Moby Dick" ফিরিয়ে দেয়।
সঠিক দেখতে এমন একটি ফিল্টার কেন কিছুই ফিরিয়ে দেয় না
প্রায় সবসময়, এটি একটি টাইপ অমিল। বিনির্দেশ বলে যে বিভিন্ন ধরনের
মান কখনই সমান নয় এবং কখনই সাজানো হয় না, তাই "8.95" কোটেডে সংরক্ষিত মূল্য
@.price < 10-এর সাথে মিলে না, এবং @.price == 8.95-এর সাথেও মিলে না।
কোনো ফিল্টার কিছুই ফিরিয়ে দিলে, কোয়েরি পরীক্ষা করার আগে ডকুমেন্টে টাইপ পরীক্ষা করুন।
দ্বিতীয় কারণ হলো ফিল্টারকে ভুল স্তরে সংযুক্ত করা। একটি ফিল্টার তার সংযুক্ত
মানের চাইল্ডের মধ্য থেকে বাছাই করে, তাই এটি অ্যারের পরে যায়:
book[?@.price < 10], book.price[?...] নয়। একটি অবজেক্টে সংযুক্ত হলে, এটি
সেই অবজেক্টের প্রতিটি প্রোপার্টি মান পরীক্ষা করে।
তৃতীয়, অনুপস্থিত মান null নয়। @.isbn == null এমন একটি বইয়ের সাথে মিলে
যার isbn শাব্দিকভাবে null, এমন নয় যার কোনো isbnই নেই। অনুপস্থিতি
পরীক্ষা করতে, !@.isbn লিখুন।
বাস্তবায়ন কোথায় অসম্মত হয়
2007 সালের নিবন্ধটি একটি প্রস্তাব ছিল, বিনির্দেশ নয়, তাই লাইব্রেরি সতেরো বছর বিভক্ত হয়ে গিয়েছিল। আপনি যদি একটি কোয়েরি সরঞ্জামের মধ্যে সরিয়ে ফেলছেন, এগুলি সেই স্থান যা পরীক্ষা করতে হবে:
- নেগেটিভ ইনডেক্স এবং নেগেটিভ পদ এখন ব্যাপকভাবে সমর্থিত এবং কিছু পুরনো লাইব্রেরিতে অনুপস্থিত।
- ব্র্যাকেটযুক্ত ফিল্টার ফর্ম পুরনো বানান। RFC 9535 নগ্ন
[?...]ব্যবহার করে, এবং অনেক সরঞ্জাম দুটির মধ্যে একটিই গ্রহণ করে। - RFC
length(),count(),match()এবংsearch()ফাংশন সংজ্ঞায়িত করে। অনেক বাস্তবায়ন এগুলি অনুপস্থিত বা ভিন্ন নামের অধীনে ভিন্ন সেট প্রদান করে। - RFC ফলাফলকে ডকুমেন্ট ক্রম দেয়। কিছু বাস্তবায়ন এটি গ্যারান্টি দেয় না, বিশেষভাবে ডিসেন্ডেন্ট সেগমেন্টের জন্য।
এই সাইটের টেস্টার উপরে তালিকাভুক্ত সিলেক্টর বাস্তবায়ন করে এবং পেজে স্পষ্টভাবে বলে, যার মধ্যে এটি কী সমর্থন করে তার একটি টেবিল সহ। ফাংশন এক্সটেনশন, ফিল্টারের ভেতরে অ্যাবসোলিউট পাথ, এবং দুটি পথকে পরস্পরের সাথে তুলনা করা বাস্তবায়িত নয়, এবং এগুলির একটি ব্যবহার করলে সিনট্যাক্স এররের পরিবর্তে বৈশিষ্ট্যের নামকরণ করে একটি বার্তা উৎপন্ন হয়। এটি একটি ইচ্ছাকৃত পছন্দ: একটি সরঞ্জাম যা সম্পূর্ণ অনুগততার দাবি করে এবং তারপর একটি এজ কেসে নীরবে ব্যর্থ হয় সেটি একটি সরঞ্জামের চেয়ে খারাপ যা আপনাকে বলে তার সীমা কোথায়।
JSONPath বা JSON Pointer
তারা ভিন্ন প্রশ্নের উত্তর দেয়।
একটি JSON Pointer ঠিক একটি মানের নাম দেয় এবং সমাধান করে
বা সমাধান করে না। এতে কোনো ওয়াইল্ডকার্ড বা ফিল্টার নেই, এবং এটিই কারণ
JSON Schema, JSON Patch এবং বেশিরভাগ বৈধতা ত্রুটি বার্তা এটি ব্যবহার করে: একটি অস্পষ্ট
ঠিকানা সেটিই যা তাদের প্রয়োজন। /store/book/0/title একটি স্থানের অর্থ।
একটি JSONPath কোয়েরি একটি অনুসন্ধান। এটি অনেক মান বা কোনোটিই ফিরিয়ে দিতে পারে, এবং এটি ফিল্টার করতে পারে। আপনি ইতিমধ্যে না জানলে যা আপনি চান সেটি কোথায় আছে তা ব্যবহার করুন।
আপনি যদি ঠিকানা জানেন, একটি pointer ব্যবহার করুন। আপনি যদি কিছু খুঁজছেন, একটি কোয়েরি ব্যবহার করুন। এই সাইটের উভয় সরঞ্জাম প্রতিটি ফলাফল যে পঙ্ক্তিতে আছে সেটি রিপোর্ট করে, তাই যেকোনো পদ্ধতিতে আপনি একটি অমূর্ত ফলাফল তালিকায় নয় বরং ডকুমেন্টে ফিরে আসেন।