§

ทดสอบ JSONPath expression

รูปแบบผลลัพธ์:
เอกสารอ้างอิง JSONPath อย่างย่อ
Token Meaning
$Root element ของเอกสาร
@Element ปัจจุบัน (ใช้ภายใน filter expression)
.Child member operator: เลือก child ที่ระบุชื่อ
..Recursive descent: ค้นหาใน descendant ทั้งหมด
*Wildcard: match element หรือ property ใด ๆ
[*]ทุก item ของ array
[n]Array element ที่ index n (เริ่มจากศูนย์)
[start:end]Array slice จาก start ถึง (ไม่รวม) end
[?(@.x)]Filter: item ที่มี property x อยู่
[?(@.x==1)]Filter: item ที่ property x เท่ากับ 1
[(@.length-1)]Script expression: element สุดท้ายของ array

JSONPath ปรากฏทุกที่ที่ API contract ต้องถูกตรวจสอบกับ payload จริง ทีม fintech ที่เขียน Postman regression suite ยืนยัน response field ด้วย JSONPath ในแท็บ Test สคริปต์ k6 load-test ดึงค่าจาก API response ด้วย jsonpath() เพื่อกำหนด SLA threshold ภายใน check() block และ runbook on-call ของ SRE ใช้ filter expression อย่าง [?(@.status=="error")] เพื่อแยก JSON log ก่อนแจ้งเตือน การรัน expression เหล่านั้นในแท็บเบราว์เซอร์ทำให้ fixture payload ที่เป็นความลับ, PII ลูกค้า และ API response ก่อน release อยู่ออกจาก hosted query service ใด ๆ

JSONPath คืออะไร?

JSONPath คือภาษา query สำหรับเอกสาร JSON เทียบเท่า JSON ของ XPath สำหรับ XML Stefan Goessner เสนอในปี 2007 เป็นวิธีสั้น อ่านง่าย ในการชี้ไปที่ node ภายใน JSON tree โดยไม่ต้องเขียน parser Expression เริ่มต้นด้วย root selector $ และ chain property accessor, array subscript, wildcard, recursive descent และ filter condition จนเลือก node ที่ต้องการ ในปี 2024 IETF เผยแพร่ RFC 9535 เพื่อกำหนดมาตรฐาน syntax ที่แตกแยกใน implementation ต่าง ๆ tester นี้รันบน jsonpath-plus ซึ่งเป็น JavaScript implementation ที่ใช้กันแพร่หลายครอบคลุม Goessner draft, ส่วนใหญ่ของ RFC 9535 และ extension operator เพิ่มเติม

วิธีการทำงานของ JSONPath

JSONPath expression อ่านจากซ้ายไปขวาและเดินผ่านเอกสาร JSON ทีละขั้นตอน แต่ละขั้นตอนรับชุด node ที่รอดจากขั้นตอนก่อนหน้าและกรองให้แคบลง pipeline การประเมินทั้งหมด:

  1. ยึดด้วย root selector $ ทุก expression เริ่มที่นี่ ชี้ไปที่ค่า top-level ไม่ว่าจะเป็น object หรือ array ชื่อ property ที่ไม่มี $ นำหน้าไม่ใช่ JSONPath ที่ถูกต้อง
  2. เดินเข้า child member ด้วย dot notation ($.store.book) หรือ bracket notation ($['store']['book']) Bracket notation จำเป็นเมื่อ key มีช่องว่าง เส้นขีด หรืออักขระที่ไม่ใช่ identifier ที่ถูกต้อง
  3. ค้นหาทุกระดับพร้อมกันด้วย recursive descent operator .. Expression $..author รวบรวมทุกค่า author ที่ใด ๆ ใน tree โดยไม่คำนึงถึงความลึก นี่คือ operator ที่ JMESPath ไม่มี
  4. เลือก array element ตาม index ([0], [-1] สำหรับ item สุดท้ายใน jsonpath-plus) slice ด้วย notation [start:end] ([0:3] คืนสามรายการแรก) หรือดึงทุก element ด้วย wildcard [*]
  5. Filter element ด้วย predicate ภายใน [?(...)] ภายใน predicate @ หมายถึง element ปัจจุบัน ดังนั้น [?(@.price<10)] เก็บเฉพาะ item ที่ field price น้อยกว่า 10 Filter compose กับส่วนที่เหลือของ path ดังนั้นคุณสามารถ filter แล้ว descend หรือ descend แล้ว filter ได้
  6. เลือกรูปแบบผลลัพธ์ ค่า คืนข้อมูลที่ match เอง Path คืน JSONPath ของแต่ละ match เพื่อให้เห็นว่า engine resolve อะไร Pointer คืน RFC 6901 JSON Pointer ที่เทียบเท่าสำหรับแต่ละ match ซึ่งมีประโยชน์เมื่อ consumer downstream คือ JSON Patch หรือ JSON Schema validator

ทำไมต้องใช้ JSONPath tester นี้?

  • JSON ของคุณไม่ออกจากเบราว์เซอร์ Query รันภายในหน้า ดังนั้น production fixture, PII ลูกค้า และ API response ก่อน release จะอยู่บนเครื่องของคุณ
  • Engine คือ jsonpath-plus 9.x ซึ่งเป็นไลบรารีเดียวกับที่รองรับ test suite และ CI assertion ใน production จำนวนมาก ผลลัพธ์ที่คุณเห็นที่นี่ตรงกับผลลัพธ์ที่ build pipeline ของคุณจะเห็น
  • สาม output mode ครอบคลุม consumer downstream ที่พบบ่อย: ค่า ดิบสำหรับคัดลอกวาง Path สำหรับ debug การ resolve ของ engine และ RFC 6901 Pointer สำหรับ JSON Patch และ JSON Schema workflow
  • Filter expression รันด้วย preventEval: true ดังนั้น query ที่วางมาไม่สามารถ execute JavaScript ตามอำเภอใจกับหน้า host ได้ สิ่งนี้สำคัญเมื่อ expression มาจากข้อความ Slack, Jira ticket หรือ clipboard ของเพื่อนร่วมงาน

การใช้งานทั่วไปของ JSONPath

JSONPath ปรากฏทุกที่ที่โค้ดต้องดึง field จาก JSON payload โดยไม่ต้องเขียน recursive descent เอง:

  • Postman test: แท็บ Tests ใน Postman expose pm.response.json() พร้อมการเข้าถึงแบบ JSONPath-style สำหรับ assertion ทีมเขียน expression เดียวอย่าง $.data.user.email เพื่อดึง field จาก response และ assert ใน CI
  • k6 load test: k6 script เรียก jsonpath() ภายใน check() block เพื่อดึงค่าจาก response body และยืนยัน SLA threshold Expression เดียวกับที่พิสูจน์ contract ใน Postman สามารถ gate load test ภายใต้ k6 ได้
  • JSON DSL สำหรับ data transform: AWS Step Functions ประเมิน JSONPath ภายใน InputPath, ResultPath และ Parameters เพื่อปรับรูปร่าง event payload ระหว่าง state Argo Workflows ใช้ JSONPath ใน withParam เพื่อ fan-out task บน array และ Kubernetes kubectl -o jsonpath ใช้ syntax เดียวกันเพื่อดึง field จาก cluster object

ตัวอย่างที่ใช้งานได้จริง

Fixture ของ Goessner ที่เป็น canonical คือเอกสาร book store ที่มีหนังสือสี่เล่ม แต่ละเล่มมี category, author, title และ price กับ fixture นั้น expression $.store.book[?(@.price<10)].title รันใน 3 ขั้นตอน ก่อน $.store.book resolve เป็น array ของหนังสือทั้งสี่เล่ม จากนั้น filter [?(@.price<10)] เก็บเฉพาะหนังสือที่ราคาต่ำกว่า 10 (entry ที่ 8.95) สุดท้าย .title ดึง title ของหนังสือนั้น ผลลัพธ์คือ ["Sayings of the Century"] สลับเป็น Path จะคืน ["$['store']['book'][0]['title']"] และ Pointer จะคืน ["/store/book/0/title"]

ทดสอบ expression ที่นี่ แล้ว drop ลงใน Postman, k6, kubectl หรือ Step Functions state machine ได้เลย วาง query คัดลอก ไม่มีการส่งผ่านเครือข่าย

JSONPath คืออะไร?

JSONPath คือภาษา query สำหรับเอกสาร JSON เทียบเท่ากับ XPath สำหรับ XML เสนอโดย Stefan Goessner ในปี 2007 และกำหนดมาตรฐานโดย IETF เป็น RFC 9535 ในปี 2024 ใช้ syntax expression กระชับที่เริ่มต้นด้วย $ (root ของเอกสาร) และรองรับ dot notation, array subscript, wildcard, slice, recursive descent (..) และ filter expression ([?(...)]) เพื่อเลือก node ภายใน JSON tree

JSONPath ต่างจาก JMESPath หรือ jq อย่างไร?

ทั้งสามตัว query JSON แต่ grammar และเป้าหมายต่างกัน JMESPath เป็นมาตรฐาน AWS CLI / SDK: เข้มงวดกว่า JSONPath ไม่มี recursive descent สร้างสำหรับ projection ที่คาดเดาได้และไม่มี side effect jq เป็นภาษา scripting ที่ Turing-complete ที่ไม่เพียงแค่ query JSON แต่ transform, reduce และ stream ด้วย JSONPath อยู่ระหว่างกลาง: มี expressive มากกว่า JMESPath ขอบคุณ recursive descent และ filter เบากว่า jq และเป็น syntax ที่ได้รับการรองรับกว้างขวางที่สุดใน test tooling (Postman, Playwright, REST Assured, kubectl, Step Functions) Tester นี้ implement JSONPath

Tester นี้ใช้ dialect ใด?

Tester นี้รัน jsonpath-plus 9.x ไลบรารีนั้น implement Goessner 2007 spec ครอบคลุมส่วนใหญ่ของ RFC 9535 และเพิ่ม extension operator อย่าง type check (@.string(), @.number(), @.boolean()) และ parent navigation (^) Flag preventEval: true เปิดอยู่เสมอ ดังนั้น filter predicate รันผ่าน interpreter ที่ปลอดภัยแทน eval() ของ JavaScript query ที่วางมาไม่สามารถ execute โค้ดตามอำเภอใจกับหน้านี้ได้

สามารถคัดลอกค่าที่ match แต่ละรายการได้หรือไม่?

ได้ ปุ่ม คัดลอกไปยังคลิปบอร์ด คัดลอก result block ทั้งหมดเป็น JSON array เพื่อดึงค่าเดียว สลับ output mode เป็น ค่า จากนั้นเลือกบรรทัดที่ต้องการใน result textarea และใช้ shortcut คัดลอกปกติของเบราว์เซอร์ (Ctrl/Cmd + C) ผลลัพธ์เป็น plain JSON text ดังนั้นวางลงใน code editor, terminal, Postman test หรือข้อความ Slack ได้สะอาด