§

JSONPath এক্সপ্রেশন পরীক্ষা করুন

আউটপুট ফরম্যাট:
JSONPath দ্রুত রেফারেন্স
Token Meaning
$ডকুমেন্টের রুট এলিমেন্ট
@বর্তমান এলিমেন্ট (ফিল্টার এক্সপ্রেশনের ভেতরে ব্যবহৃত)
.চাইল্ড মেম্বার অপারেটর: একটি নামযুক্ত চাইল্ড সিলেক্ট করে
..পুনরাবর্তী অবতরণ: সব বংশধর খোঁজে
*ওয়াইল্ডকার্ড: যেকোনো এলিমেন্ট বা প্রপার্টি ম্যাচ করে
[*]একটি অ্যারের সব আইটেম
[n]index n-তে অ্যারে এলিমেন্ট (শূন্য-ভিত্তিক)
[start:end]start থেকে end পর্যন্ত (end বাদ দিয়ে) অ্যারে স্লাইস
[?(@.x)]ফিল্টার: যেসব আইটেমে প্রপার্টি x আছে
[?(@.x==1)]ফিল্টার: যেসব আইটেমে প্রপার্টি x-এর মান 1
[(@.length-1)]স্ক্রিপ্ট এক্সপ্রেশন: অ্যারের শেষ এলিমেন্ট

বাংলাদেশ ও পশ্চিমবঙ্গের ডেভেলপাররা যখন REST API টেস্টিং বা মাইক্রোসার্ভিস ইন্টিগ্রেশন নিয়ে কাজ করেন, তখন JSONPath অপরিহার্য হয়ে ওঠে। Postman-এর Test ট্যাবে $.data.user.email-এর মতো এক্সপ্রেশন দিয়ে API রেসপন্স ভ্যালিডেশন করা, k6 লোড টেস্টে jsonpath() দিয়ে SLA থ্রেশহোল্ড যাচাই করা, বা AWS Step Functions-এ InputPath-এ JSONPath ব্যবহার করা — এই টুলটি এই সব কাজ ব্রাউজারেই করতে দেয়। production fixture, customer ডেটা বা pre-release API রেসপন্স কোনো বাইরের সার্ভারে পাঠাতে হয় না।

JSONPath কী?

JSONPath হলো JSON ডকুমেন্টের জন্য একটি query language, XML-এর জন্য XPath-এর JSON সমতুল্য। Stefan Goessner 2007 সালে এটি প্রস্তাব করেছিলেন একটি সংক্ষিপ্ত, পাঠযোগ্য উপায় হিসেবে JSON ট্রি-এর মধ্যে একটি নোড নির্দেশ করতে, পার্সার না লিখেই। একটি এক্সপ্রেশন রুট সিলেক্টর $ দিয়ে শুরু হয় এবং প্রপার্টি অ্যাক্সেসর, অ্যারে সাবস্ক্রিপ্ট, ওয়াইল্ডকার্ড, পুনরাবর্তী অবতরণ এবং ফিল্টার কন্ডিশন চেইন করে কাঙ্ক্ষিত নোড বের করে। 2024 সালে IETF বিভিন্ন ইমপ্লিমেন্টেশনে বিভক্ত সিনট্যাক্স মানসম্পন্ন করতে RFC 9535 প্রকাশ করেছে; এই tester jsonpath-plus-এ চলে, একটি ব্যাপকভাবে ব্যবহৃত JavaScript ইমপ্লিমেন্টেশন যা Goessner ড্রাফট, বেশিরভাগ RFC 9535, এবং কিছু এক্সটেনশন অপারেটর কভার করে।

JSONPath কীভাবে কাজ করে

একটি JSONPath এক্সপ্রেশন বাম থেকে ডানে পড়ে এবং একটি JSON ডকুমেন্ট এক ধাপ করে walk করে। প্রতিটি ধাপ আগের ধাপে টিকে থাকা নোডগুলো নিয়ে আরও সংকুচিত করে। সম্পূর্ণ evaluation pipeline:

  1. রুট সিলেক্টর $ দিয়ে অ্যাংকর করুন। প্রতিটি এক্সপ্রেশন এখানে শুরু হয়, টপ-লেভেল ভ্যালু নির্দেশ করে, সেটি অবজেক্ট বা অ্যারে যাই হোক। $ ছাড়া bare প্রপার্টি নাম বৈধ JSONPath নয়।
  2. ডট নোটেশন ($.store.book) বা ব্র্যাকেট নোটেশন ($['store']['book']) দিয়ে চাইল্ড মেম্বারে প্রবেশ করুন। যখন একটি key-তে স্পেস, হাইফেন, বা বৈধ আইডেন্টিফায়ার নয় এমন কোনো ক্যারেক্টার থাকে তখন ব্র্যাকেট নোটেশন প্রয়োজন।
  3. পুনরাবর্তী অবতরণ অপারেটর .. দিয়ে একসাথে সব লেভেল খুঁজুন। $..author এক্সপ্রেশন ট্রি-তে যে কোনো গভীরতায় প্রতিটি author ভ্যালু সংগ্রহ করে। এটি সেই অপারেটর যা JMESPath-এ নেই।
  4. ইন্ডেক্স দিয়ে অ্যারে এলিমেন্ট পিক করুন ([0], jsonpath-plus-এ শেষ আইটেমের জন্য [-1]), [start:end] নোটেশন দিয়ে স্লাইস করুন ([0:3] প্রথম তিনটি রিটার্ন করে), বা ওয়াইল্ডকার্ড [*] দিয়ে প্রতিটি এলিমেন্ট নিন।
  5. [?(...)]-এর ভেতরে প্রিডিকেট দিয়ে এলিমেন্ট ফিল্টার করুন। প্রিডিকেটের ভেতরে, @ বর্তমান এলিমেন্টকে নির্দেশ করে, তাই [?(@.price<10)] শুধুমাত্র সেসব আইটেম রাখে যাদের price ফিল্ড 10-এর কম। ফিল্টার path-এর বাকি অংশের সাথে কম্পোজ করে, তাই ফিল্টার করার পর অবতরণ বা অবতরণের পর ফিল্টার করা যায়।
  6. আউটপুট ফরম্যাট বেছে নিন। Values ম্যাচ করা ডেটা নিজেই রিটার্ন করে। Paths প্রতিটি ম্যাচের JSONPath রিটার্ন করে যাতে engine কী রিজলভ করেছে তা দেখা যায়। Pointers প্রতিটি ম্যাচের সমতুল্য RFC 6901 JSON Pointer রিটার্ন করে, যা JSON Patch বা JSON Schema validator-এর জন্য দরকারী।

এই JSONPath tester কেন ব্যবহার করবেন?

  • আপনার JSON কখনো ব্রাউজার ছাড়ে না। query পেজের ভেতরেই চলে, তাই production fixture, customer PII এবং pre-release API রেসপন্স আপনার মেশিনেই থাকে।
  • ইঞ্জিনটি jsonpath-plus 9.x, একই লাইব্রেরি যা অনেক production টেস্ট স্যুট ও CI assertion-এ ব্যবহৃত হয়। আপনি এখানে যে ফলাফল দেখেন তা আপনার বিল্ড পাইপলাইনে যা দেখবেন তার সাথে মিলে।
  • তিনটি আউটপুট মোড সাধারণ ডাউনস্ট্রিম consumer কভার করে: কপি-পেস্টের জন্য raw Values, engine-এর রিজলিউশন ডিবাগ করার জন্য Paths, এবং JSON Patch ও JSON Schema ওয়ার্কফ্লোর জন্য RFC 6901 Pointers
  • ফিল্টার এক্সপ্রেশন preventEval: true দিয়ে চলে, তাই পেস্ট করা query হোস্ট পেজের বিরুদ্ধে arbitrary JavaScript এক্সিকিউট করতে পারে না। এটা গুরুত্বপূর্ণ যখন এক্সপ্রেশনটি Slack মেসেজ, Jira টিকেট, বা কোনো সহকর্মীর ক্লিপবোর্ড থেকে এসেছে।

JSONPath-এর সাধারণ প্রয়োগ

JSONPath যেখানেই কোড হাতে লেখা পুনরাবর্তী অবতরণ না করে JSON payload থেকে একটি ফিল্ড বের করতে হয় সেখানে দেখা যায়:

  • Postman টেস্ট: Postman-এর Tests ট্যাব assertions-এর জন্য JSONPath-স্টাইল অ্যাক্সেস সহ pm.response.json() এক্সপোজ করে। টিমগুলো একটি রেসপন্স থেকে ফিল্ড বের করে CI-তে assert করতে $.data.user.email-এর মতো একটি এক্সপ্রেশন লেখে।
  • k6 লোড টেস্ট: k6 স্ক্রিপ্ট রেসপন্স বডি থেকে ভ্যালু এক্সট্র্যাক্ট করতে এবং SLA থ্রেশহোল্ড assert করতে check() ব্লকের ভেতরে jsonpath() কল করে। Postman-এ একটি contract প্রমাণ করা একই এক্সপ্রেশন k6-এর অধীনে একটি লোড টেস্ট গেট করতে পারে।
  • ডেটা ট্রান্সফর্মের জন্য JSON DSL: AWS Step Functions স্টেটের মধ্যে ইভেন্ট payload রিশেপ করতে InputPath, ResultPath, এবং Parameters-এর ভেতরে JSONPath মূল্যায়ন করে। Argo Workflows একটি অ্যারে জুড়ে টাস্ক fan-out করতে withParam-এ JSONPath ব্যবহার করে। Kubernetes kubectl -o jsonpath ক্লাস্টার অবজেক্ট থেকে ফিল্ড এক্সট্র্যাক্ট করতে একই সিনট্যাক্স ব্যবহার করে।

ব্যবহারিক উদাহরণ

ক্যানোনিকাল Goessner fixture হলো চারটি বই সহ book store ডকুমেন্ট, প্রতিটিতে category, author, title, এবং price আছে। সেই fixture-এর বিরুদ্ধে, $.store.book[?(@.price<10)].title এক্সপ্রেশন তিনটি ধাপে চলে। প্রথমে, $.store.book চারটি বইয়ের অ্যারেতে রিজলভ হয়। এরপর ফিল্টার [?(@.price<10)] শুধুমাত্র 10-এর নিচে দামের একটি বই রাখে (8.95-এর এন্ট্রি)। অবশেষে, .title সেই বইয়ের শিরোনাম এক্সট্র্যাক্ট করে। ফলাফল হলো ["Sayings of the Century"]Paths-এ স্যুইচ করলে ["$['store']['book'][0]['title']"] রিটার্ন করে, এবং Pointers ["/store/book/0/title"] রিটার্ন করে।

এখানে আপনার এক্সপ্রেশন prototype করুন, তারপর সরাসরি Postman, k6, kubectl, বা Step Functions state machine-এ ড্রপ করুন। পেস্ট করুন, query করুন, কপি করুন। নেটওয়ার্কে কিছু যায় না।

JSONPath কী?

JSONPath হলো JSON ডকুমেন্টের জন্য একটি query language, XML-এর জন্য XPath-এর সাদৃশ্য। Stefan Goessner 2007 সালে প্রস্তাব করেছিলেন এবং IETF 2024 সালে RFC 9535 হিসেবে মানসম্পন্ন করেছে।

এটি $ (ডকুমেন্ট রুট) দিয়ে শুরু হওয়া একটি compact এক্সপ্রেশন সিনট্যাক্স ব্যবহার করে এবং JSON ট্রি-এর ভেতরে নোড সিলেক্ট করতে ডট নোটেশন, অ্যারে সাবস্ক্রিপ্ট, ওয়াইল্ডকার্ড, স্লাইস, পুনরাবর্তী অবতরণ (..), এবং ফিল্টার এক্সপ্রেশন ([?(...)]) সমর্থন করে।

JSONPath JMESPath বা jq থেকে কীভাবে আলাদা?

তিনটিই JSON query করে, কিন্তু তাদের grammar ও লক্ষ্য আলাদা। JMESPath হলো AWS CLI / SDK মানদণ্ড: JSONPath-এর চেয়ে কঠোর, কোনো পুনরাবর্তী অবতরণ নেই, পূর্বানুমানযোগ্য side-effect-free projection-এর জন্য তৈরি।

jq হলো একটি Turing-complete স্ক্রিপ্টিং ভাষা যা শুধু JSON query করে না বরং transform, reduce এবং stream করে। JSONPath মাঝখানে আছে: পুনরাবর্তী অবতরণ ও ফিল্টারের কারণে JMESPath-এর চেয়ে বেশি expressive, jq-এর চেয়ে হালকা, এবং সাধারণ-উদ্দেশ্য টেস্ট টুলিং (Postman, Playwright, REST Assured, kubectl, Step Functions)-এ সবচেয়ে ব্যাপকভাবে সমর্থিত সিনট্যাক্স। এই tester JSONPath ইমপ্লিমেন্ট করে।

এই tester কোন dialect ব্যবহার করে?

এই tester jsonpath-plus 9.x চালায়। সেই লাইব্রেরি Goessner 2007 spec ইমপ্লিমেন্ট করে, বেশিরভাগ RFC 9535 কভার করে, এবং type check (@.string(), @.number(), @.boolean()) ও parent navigation (^)-এর মতো এক্সটেনশন অপারেটর যোগ করে।

preventEval: true ফ্ল্যাগ সর্বদা সেট থাকে, তাই ফিল্টার প্রিডিকেট JavaScript eval() বিল্ট-ইন-এর পরিবর্তে একটি নিরাপদ interpreter-এর মাধ্যমে চলে। পেস্ট করা query এই পেজের বিরুদ্ধে arbitrary code এক্সিকিউট করতে পারে না।

আমি কি পৃথক ম্যাচড ভ্যালু কপি করতে পারি?

হ্যাঁ। ক্লিপবোর্ডে কপি করুন বাটন সম্পূর্ণ রেজাল্ট ব্লক JSON অ্যারে হিসেবে কপি করে। একটি একক ভ্যালু নিতে, আউটপুট মোড Values-এ স্যুইচ করুন, তারপর রেজাল্ট textarea-তে আপনার কাঙ্ক্ষিত লাইন সিলেক্ট করুন এবং আপনার ব্রাউজারের সাধারণ কপি শর্টকাট (Ctrl/Cmd + C) ব্যবহার করুন।

আউটপুট plain JSON টেক্সট, তাই এটি কোড এডিটর, টার্মিনাল, Postman টেস্ট, বা Slack মেসেজে পরিষ্কারভাবে পেস্ট হয়।