JSONPath ইভ্যালুয়েটর & টেস্টার
JSON পেস্ট করুন, একটি JSONPath এক্সপ্রেশন টাইপ করুন, এবং ম্যাচ হওয়া ভ্যালু ও তাদের সঠিক
পাথ লাইভ আপডেট হতে দেখুন। সমর্থন: $ রুট, .child, [*] ওয়াইল্ডকার্ড,
.. রিকার্সিভ ডিসেন্ট, [n] ইনডেক্স, [start:end:step] স্লাইস, ইউনিয়ন
এবং [?(@.price < 10)] ফিল্টার। সবকিছু আপনার ব্রাউজারে চলে — কিছুই আপলোড হয় না।
[ "Nigel Rees", "Evelyn Waugh", "Herman Melville", "J. R. R. Tolkien" ]
$['store']['book'][0]['author'] $['store']['book'][1]['author'] $['store']['book'][2]['author'] $['store']['book'][3]['author']
JSONPath টেস্টার কীভাবে ব্যবহার করবেন
বাঁদিকে JSON পেস্ট করুন (বা নমুনা রেখে দিন), তারপর JSONPath বক্সে একটি এক্সপ্রেশন টাইপ করুন। টাইপ করার সাথে সাথেই ফলাফল আপডেট হয়: Values ট্যাব ম্যাচ হওয়া ভ্যালুগুলো একটি JSON অ্যারে হিসেবে দেখায়, এবং Paths ট্যাব প্রতিটি ম্যাচের সঠিক অবস্থান দেখায়। সাধারণ প্যাটার্ন লোড করতে উদাহরণ চিপ ব্যবহার করুন, আপনার JSON সুন্দর-প্রিন্ট করতে Format, এবং বর্তমান ট্যাব কপি করতে Copy। আপনার JSON পার্স না হলে, বা পাথে সিনট্যাক্স ত্রুটি থাকলে, স্ট্যাটাস লাইন ঠিক কী ভুল তা জানিয়ে দেয়।
JSONPath সিনট্যাক্স
| সিনট্যাক্স | অর্থ | উদাহরণ |
|---|---|---|
$ | ডকুমেন্টের রুট — প্রতিটি পাথ এখান থেকেই শুরু হয়। | $ |
.key or ['key'] | নাম দিয়ে একটি চাইল্ড প্রপার্টি। ডট, স্পেস বা হাইফেনযুক্ত কি-এর জন্য ব্র্যাকেট ব্যবহার করুন। | $.store.bicycle.color |
* | ওয়াইল্ডকার্ড — কোনো অ্যারের প্রতিটি এলিমেন্ট বা কোনো অবজেক্টের প্রতিটি ভ্যালু। | $.store.book[*] |
.. | রিকার্সিভ ডিসেন্ট — সেই নামটি বর্তমান নোড ও প্রতিটি বংশধরে খুঁজুন। | $..author |
[n] | অ্যারে ইনডেক্স (0 থেকে শুরু)। ঋণাত্মক শেষ থেকে গোনে, তাই [-1] শেষটি। | $.store.book[2] |
[start:end:step] | অ্যারে স্লাইস, Python-স্টাইল। যেকোনো অংশ ঐচ্ছিক; ঋণাত্মক step উল্টে দেয়। | $.store.book[0:2] |
[a,b] / ['x','y'] | ইউনিয়ন — একই ধাপে একাধিক ইনডেক্স বা নাম। | $.store.book[0,2] |
[?(expr)] | ফিল্টার — কেবল সেই এলিমেন্টগুলো রাখুন যেখানে এক্সপ্রেশন সত্য। | $.store.book[?(@.price < 10)] |
ফিল্টার এক্সপ্রেশন [?( … )]
একটি ফিল্টার কেবল সেই এলিমেন্টগুলো রাখে যেগুলোর জন্য তার এক্সপ্রেশন সত্য। ফিল্টারের ভেতরে,
@ হলো যে এলিমেন্টটি পরীক্ষা করা হচ্ছে এবং $ হলো পুরো ডকুমেন্ট, তাই আপনি কোনো ফিল্ডের
তুলনা কোনো স্থিরাঙ্কের সাথে বা JSON-এ অন্য কোথাও থাকা ভ্যালুর সাথে করতে পারেন:
| ফিল্টারে | অর্থ | উদাহরণ |
|---|---|---|
@ | যে বর্তমান এলিমেন্টটি পরীক্ষা করা হচ্ছে। | @.price |
$ | ডকুমেন্ট রুট (অন্য কোথাও থাকা কোনো ভ্যালুর সাথে তুলনা করতে)। | @.price < $.expensive |
== != | সমান / সমান নয় (শিথিল — 3 আর "3" সমান)। | @.category == 'fiction' |
< <= > >= | সংখ্যাগত বা স্ট্রিং ক্রমের তুলনা। | @.price >= 8.99 |
=~ | রেগুলার-এক্সপ্রেশন ম্যাচ — ডান পাশ /pattern/flags। | @.author =~ /^J/i |
&& || ! | শর্ত মেলান: and, or, not। | @.price < 10 && @.category == 'fiction' |
@.field (bare) | অস্তিত্ব পরীক্ষা — প্রপার্টিটি থাকলে সত্য। | @.isbn |
উদাহরণস্বরূপ, $.store.book[?(@.price < 10)].title দশের কম দামের প্রতিটি বইয়ের
শিরোনাম ফেরত দেয়, এবং $.store.book[?(@.price < $.expensive)] ডকুমেন্টের নিজের
expensive থ্রেশহোল্ডের চেয়ে সস্তা প্রতিটি বই ফেরত দেয়।
সমাধানসহ উদাহরণ
বুকস্টোর নমুনা লোড থাকলে, $..author রিকার্সিভ ডিসেন্ট দিয়ে পুরো ডকুমেন্ট ঘুরে বেড়ায়
এবং চারজন লেখককেই ফেরত দেয়। $.store.book[?(@.category == 'fiction')].title এটিকে তিনটি ফিকশন
শিরোনামে সীমিত করে, এবং $.store.book[-1:].title শেষ বইটি নিতে একটি স্লাইস
ব্যবহার করে। প্রতিটি ফলাফল তার ক্যানোনিকাল ব্র্যাকেট-নোটেশন পাথও বহন করে — প্রথম লেখকের জন্য তা
$['store']['book'][0]['author'] — তাই কোনো ভ্যালু ঠিক কোথা থেকে এসেছে আপনি সবসময় জানেন।
এই ইভ্যালুয়েটর কী সমর্থন করে (এবং এটি নিরাপদ কীভাবে থাকে)
এই টুলটি সাধারণ Goessner-স্টাইল JSONPath বাস্তবায়ন করে: রুট, চাইল্ড (ডট ও ব্র্যাকেট), ওয়াইল্ডকার্ড,
রিকার্সিভ ডিসেন্ট, অ্যারে ইনডেক্স (ঋণাত্মকসহ), Python-স্টাইল স্লাইস, ইনডেক্স বা নামের ইউনিয়ন, এবং তুলনা,
যৌক্তিক ও regex অপারেটরযুক্ত ফিল্টার এক্সপ্রেশন। কিছু লাইব্রেরির বিপরীতে, এটি ফিল্টারগুলো একটি ছোট
হাতে-লেখা ইন্টারপ্রেটার দিয়ে মূল্যায়ন করে এবং কখনো eval() বা
Function কনস্ট্রাক্টর ব্যবহার করে না — তাই অবিশ্বস্ত JSON বা জটিল ফিল্টার
পেস্ট করা নিরাপদ, এবং এটি কঠোর Content-Security-Policy-র অধীনে কাজ করে। স্ক্রিপ্ট-স্টাইল ফিল্টার
(ইচ্ছেমতো JavaScript) সমর্থিত নয়, যা একটি ইচ্ছাকৃত নিরাপত্তা সিদ্ধান্ত।
সাধারণ ব্যবহার
- কোড না লিখেই কোনো বড় API রেসপন্স থেকে একটি নির্দিষ্ট ফিল্ড বের করুন।
- Postman, Karate, REST-assured ও CI টেস্ট স্যুটে ব্যবহৃত JSONPath assertions লিখুন ও ডিবাগ করুন।
$..*ও রিকার্সিভ ডিসেন্ট দিয়ে কোনো অপরিচিত JSON পেলোড ঘেঁটে দেখুন।- একটি কোয়েরিতে কোনো নেস্টেড ডকুমেন্ট থেকে প্রতিটি দাম, id বা URL বের করুন।
- কোনো লগ পাইপলাইন, কনফিগ ফাইল বা ট্রান্সফর্ম ধাপের জন্য পাথ এক্সপ্রেশনের প্রোটোটাইপ তৈরি করুন।
গোপনীয়তা
এই ইভ্যালুয়েটরটি বিশুদ্ধ ক্লায়েন্ট-সাইড JavaScript — আপনার JSON আপনার ব্রাউজারে পার্স ও কোয়েরি হয়, কিছুই আপলোড হয় না, কিছুই লগ হয় না, এবং কোনো নেটওয়ার্ক অনুরোধ নেই। লোড হওয়ার পরে এটি অফলাইনে কাজ করতে থাকে।
প্রায়ই জিজ্ঞাসিত প্রশ্ন
- JSONPath কী?
- JSONPath হলো JSON-এর জন্য একটি কোয়েরি ভাষা — চেতনায় XML-এর XPath-এর মতো। আপনি $.store.book[*].author-এর মতো একটি পাথ এক্সপ্রেশন লেখেন এবং এটি ডকুমেন্টের প্রতিটি সেই ভ্যালু ফেরত দেয় যা পাথটি নির্বাচন করে। বড় JSON রেসপন্স থেকে নির্দিষ্ট ভ্যালু বের করতে, API টেস্টে assertions লিখতে, এবং লগ প্রসেসর ও কনফিগারেশন সিস্টেমের মতো টুলের ভেতরে এটি ব্যবহৃত হয়। এই ইভ্যালুয়েটরটি ব্যাপকভাবে ব্যবহৃত Goessner সিনট্যাক্স বাস্তবায়ন করে — রুট ($), চাইল্ড (.name বা ['name']), ওয়াইল্ডকার্ড (*), রিকার্সিভ ডিসেন্ট (..), অ্যারে ইনডেক্স ও স্লাইস, ইউনিয়ন এবং ফিল্টার এক্সপ্রেশন।
- যত গভীরেই নেস্টেড থাকুক, আমি কোনো ভ্যালু কীভাবে খুঁজব?
- রিকার্সিভ ডিসেন্ট — .. অপারেটর — ব্যবহার করুন। $..author ডকুমেন্টের যেকোনো জায়গায়, যেকোনো গভীরতায়, প্রতিটি "author" প্রপার্টি ফেরত দেয়, তাই আপনাকে সঠিক পাথ জানার দরকার নেই। আপনি এটি অন্য ধাপের সাথে মেলাতে পারেন: $..book[0] প্রতিটি "book" অ্যারের প্রথম এলিমেন্ট নেয়, এবং $..* পুরো গঠনের প্রতিটি ভ্যালু ফেরত দেয়। কোনো অপরিচিত JSON পেলোড ঘেঁটে দেখার জন্য রিকার্সিভ ডিসেন্ট JSONPath-এর সবচেয়ে উপযোগী বৈশিষ্ট্য।
- কোন কোন ফিল্টার এক্সপ্রেশন সমর্থিত?
- ফিল্টার [?( … )]-এর ভেতরে যায় এবং প্রতিটি এলিমেন্টের বিপরীতে মূল্যায়িত হয়, যেখানে @ হলো বর্তমান এলিমেন্ট এবং $ হলো ডকুমেন্ট রুট। আপনি তুলনা অপারেটর == != < <= > >= ব্যবহার করতে পারেন (যেমন @.price < 10 বা @.category == 'fiction'), সেগুলোকে && || দিয়ে মেলাতে এবং ! দিয়ে নাকচ করতে পারেন, কোনো প্রপার্টির নাম দিয়ে তার অস্তিত্ব পরীক্ষা করতে পারেন (@.isbn), =~ দিয়ে একটি রেগুলার এক্সপ্রেশন ম্যাচ করতে পারেন (@.author =~ /^J/i), এবং ডকুমেন্টে অন্য কোথাও থাকা ভ্যালুর উল্লেখ করতে পারেন (@.price < $.expensive)। @.meta.views-এর মতো নেস্টেড ফিল্ড ও @.tags[0]-এর মতো অ্যারে ইনডেক্সও ফিল্টারের ভেতরে কাজ করে।
- এটি একটি JSON ফরম্যাটার থেকে কীভাবে আলাদা?
- একটি JSON ফরম্যাটার পুরো ডকুমেন্টকে সুন্দর-প্রিন্ট বা মিনিফাই করে — এটি বদলায় JSON কীভাবে প্রদর্শিত হয়। এর বদলে একটি JSONPath ইভ্যালুয়েটর ডেটার একটি উপসেট বের করে: আপনি এটিকে একটি কোয়েরি দেন এবং এটি কেবল ম্যাচ হওয়া ভ্যালু (এবং প্রতিটির সঠিক পাথ) ফেরত দেয়। এরা পরস্পর পরিপূরক — অনেকে পড়ার জন্য প্রথমে তাদের JSON ফরম্যাট করে, তারপর ঠিক যে অংশগুলো দরকার সেগুলো বের করতে একটি JSONPath লেখে। এই পৃষ্ঠাটি সেই প্রথম ধাপের জন্য আমাদের JSON Formatter-এ লিঙ্ক করে।
- ফলাফল পাথ $['store']['book'][0]-এর মতো কেন লেখা হয়?
- প্রতিটি ম্যাচ তার স্বাভাবিকীকৃত (ক্যানোনিকাল) পাথসহ ব্র্যাকেট নোটেশনে রিপোর্ট করা হয়। ব্র্যাকেট নোটেশন দ্ব্যর্থহীন — এটি প্রতিটি কি-এর জন্য কাজ করে, সেই কি-গুলোসহ যেগুলোতে স্পেস, ডট বা হাইফেন আছে এবং যা ডট-নোটেশন প্রকাশ করতে পারে না — তাই অন্য কোনো টুল বা কোডে ফিরিয়ে কপি করার জন্য এটি নিরাপদ রূপ। সেই প্রতিটি পাথের ভ্যালু Values ট্যাবে দেখা যায়; Paths ট্যাব দেখায় প্রতিটি ম্যাচ কোথা থেকে এসেছে।
- আমার JSON কি আপলোড বা সংরক্ষণ করা হয়?
- না। এই ইভ্যালুয়েটরটি সাধারণ JavaScript যা আপনার JSON সম্পূর্ণ আপনার ব্রাউজারে পার্স ও কোয়েরি করে — কোনো নেটওয়ার্ক অনুরোধ নেই, কিছুই লগ হয় না, এবং ডেটা কখনো আপনার ডিভাইস থেকে বাইরে যায় না। পৃষ্ঠা লোড হওয়ার পরে এটি অফলাইনেও কাজ করতে থাকে। এটি eval() বা Function কনস্ট্রাক্টরও ব্যবহার করে না: ফিল্টার এক্সপ্রেশন একটি ছোট, নিরাপদ ইন্টারপ্রেটার দিয়ে পার্স হয়, তাই অবিশ্বস্ত JSON বা জটিল ফিল্টার পেস্ট করলে যেকোনো ইচ্ছেমতো কোড চলতে পারে না।