§

Kiểm tra biểu thức JSONPath

Định dạng đầu ra:
Tham khảo nhanh JSONPath
Token Meaning
$Phần tử gốc của tài liệu
@Phần tử hiện tại (dùng trong biểu thức lọc)
.Toán tử thành viên con: chọn một con được đặt tên
..Duyệt đệ quy: tìm kiếm tất cả hậu duệ
*Ký tự đại diện: khớp với mọi phần tử hay thuộc tính
[*]Tất cả phần tử của mảng
[n]Phần tử mảng tại chỉ số n (bắt đầu từ 0)
[start:end]Slice mảng từ start đến (không bao gồm) end
[?(@.x)]Lọc: các mục có thuộc tính x tồn tại
[?(@.x==1)]Lọc: các mục có thuộc tính x bằng 1
[(@.length-1)]Biểu thức script: phần tử cuối của mảng

JSONPath xuất hiện bất cứ nơi nào hợp đồng API cần được kiểm tra với payload thực. Các nhóm fintech tại VNG, MoMo và VNPAY viết bộ kiểm tra hồi quy Postman xác nhận các trường phản hồi bằng JSONPath trong tab Test; các script k6 load-test kéo giá trị ra khỏi phản hồi API với jsonpath() để gating ngưỡng SLA bên trong các khối check(); và các runbook SRE on-call dùng biểu thức lọc như [?(@.status=="error")] để cắt nhật ký JSON CloudWatch trước khi gọi. Chạy các biểu thức đó trong tab trình duyệt giữ payload fixture độc quyền, PII khách hàng và phản hồi API trước khi phát hành khỏi bất kỳ dịch vụ truy vấn được lưu trữ nào.

JSONPath là gì?

JSONPath là ngôn ngữ truy vấn cho tài liệu JSON, tương đương JSON của XPath cho XML. Stefan Goessner đề xuất nó vào năm 2007 như một cách ngắn gọn, dễ đọc để trỏ vào một nút bên trong cây JSON mà không cần viết bộ phân tích cú pháp. Một biểu thức bắt đầu bằng selector gốc $ và chuỗi các accessor thuộc tính, subscript mảng, ký tự đại diện, duyệt đệ quy và điều kiện lọc cho đến khi chọn được các nút bạn muốn. Vào năm 2024, IETF đã xuất bản RFC 9535 để chuẩn hóa cú pháp đã bị phân mảnh qua các triển khai; trình kiểm tra này chạy trên jsonpath-plus, một triển khai JavaScript được sử dụng rộng rãi bao gồm bản nháp Goessner, hầu hết RFC 9535 và một số toán tử mở rộng thêm.

JSONPath hoạt động như thế nào

Một biểu thức JSONPath đọc từ trái sang phải và duyệt tài liệu JSON từng bước một. Mỗi bước lấy tập hợp các nút sống sót từ bước trước và thu hẹp thêm. Pipeline đánh giá đầy đủ:

  1. Neo bằng selector gốc $. Mọi biểu thức bắt đầu ở đây, trỏ vào giá trị cấp cao nhất, dù là đối tượng hay mảng. Tên thuộc tính không có $ dẫn đầu không phải JSONPath hợp lệ.
  2. Đi vào thành viên con bằng ký hiệu chấm ($.store.book) hoặc ký hiệu ngoặc ($['store']['book']). Ký hiệu ngoặc bắt buộc khi khóa chứa dấu cách, dấu gạch nối hay bất kỳ ký tự nào không phải định danh hợp lệ.
  3. Tìm kiếm mọi cấp cùng lúc bằng toán tử duyệt đệ quy ... Biểu thức $..author thu thập mọi giá trị author ở bất cứ đâu trong cây, bất kể độ sâu. Đây là toán tử mà JMESPath không có.
  4. Chọn phần tử mảng theo chỉ số ([0], [-1] cho phần tử cuối trong jsonpath-plus), slice chúng bằng ký hiệu [start:end] ([0:3] trả về ba phần tử đầu tiên), hay lấy mọi phần tử bằng ký tự đại diện [*].
  5. Lọc phần tử bằng vị từ bên trong [?(...)]. Bên trong vị từ, @ đề cập đến phần tử hiện tại, vì vậy [?(@.price<10)] chỉ giữ các mục có trường price nhỏ hơn 10. Các bộ lọc kết hợp với phần còn lại của đường dẫn, vì vậy bạn có thể lọc rồi duyệt xuống, hoặc duyệt xuống rồi lọc.
  6. Chọn định dạng đầu ra. Giá trị trả về dữ liệu khớp chính nó. Đường dẫn trả về JSONPath của mỗi kết quả để bạn thấy engine đã giải quyết cái gì. Con trỏ trả về RFC 6901 JSON Pointer tương đương cho mỗi kết quả, hữu ích khi consumer downstream là JSON Patch hay trình xác thực JSON Schema.

Tại sao dùng trình kiểm tra JSONPath này?

  • JSON của bạn không bao giờ rời khỏi trình duyệt. Truy vấn chạy trong trang, vì vậy fixture sản xuất, PII khách hàng và phản hồi API trước khi phát hành vẫn trên máy của bạn.
  • Engine là jsonpath-plus 9.x, cùng thư viện hỗ trợ nhiều bộ kiểm tra sản xuất và xác nhận CI. Kết quả bạn thấy ở đây khớp với kết quả build pipeline của bạn sẽ thấy.
  • Ba chế độ đầu ra bao phủ các consumer downstream phổ biến: Giá trị thô để sao chép-dán, Đường dẫn để gỡ lỗi quá trình giải quyết của engine, và RFC 6901 Con trỏ cho workflow JSON Patch và JSON Schema.
  • Các biểu thức lọc chạy với preventEval: true, vì vậy truy vấn được dán không thể thực thi JavaScript tùy ý trên trang host. Điều đó quan trọng khi biểu thức đến từ tin nhắn Slack, ticket Jira hay clipboard của đồng nghiệp.

Ứng dụng phổ biến của JSONPath

JSONPath xuất hiện bất cứ nơi nào mã cần kéo một trường ra khỏi payload JSON mà không cần viết bộ duyệt đệ quy thủ công:

  • Kiểm tra Postman: tab Tests trong Postman expose pm.response.json() cùng với truy cập kiểu JSONPath cho các xác nhận. Các nhóm viết một biểu thức duy nhất như $.data.user.email để kéo một trường ra khỏi phản hồi và xác nhận trên nó trong CI.
  • Load test k6: các script k6 gọi jsonpath() bên trong khối check() để trích xuất giá trị từ body phản hồi và xác nhận ngưỡng SLA. Biểu thức tương tự đã chứng minh hợp đồng trong Postman có thể gating load test trong k6.
  • JSON DSL cho biến đổi dữ liệu: AWS Step Functions đánh giá JSONPath bên trong InputPath, ResultPathParameters để định hình lại payload sự kiện giữa các trạng thái. Argo Workflows dùng JSONPath trong withParam để fan-out task trên một mảng. Kubernetes kubectl -o jsonpath dùng cùng cú pháp để trích xuất trường từ đối tượng cluster.

Ví dụ thực tế

Fixture Goessner chuẩn là tài liệu hiệu sách với bốn cuốn sách, mỗi cuốn mang category, author, titleprice. Với fixture đó, biểu thức $.store.book[?(@.price<10)].title chạy theo ba bước. Đầu tiên, $.store.book giải quyết thành mảng tất cả bốn cuốn sách. Tiếp theo, bộ lọc [?(@.price<10)] chỉ giữ cuốn sách có giá dưới 10 (mục giá 8,95). Cuối cùng, .title trích xuất tiêu đề của cuốn sách đó. Kết quả là ["Sayings of the Century"]. Chuyển sang Đường dẫn trả về ["$['store']['book'][0]['title']"]Con trỏ trả về ["/store/book/0/title"].

Prototype biểu thức của bạn ở đây, rồi thả thẳng vào Postman, k6, kubectl hay state machine Step Functions. Dán, truy vấn, sao chép. Không gì vượt qua mạng.

JSONPath là gì?

JSONPath là ngôn ngữ truy vấn cho tài liệu JSON, tương tự XPath cho XML. Được Stefan Goessner đề xuất vào năm 2007 và được IETF chuẩn hóa như RFC 9535 vào năm 2024, nó dùng cú pháp biểu thức nhỏ gọn bắt đầu bằng $ (gốc tài liệu) và hỗ trợ ký hiệu chấm, subscript mảng, ký tự đại diện, slice, duyệt đệ quy (..) và biểu thức lọc ([?(...)]) để chọn nút bên trong cây JSON.

JSONPath khác JMESPath hay jq như thế nào?

Cả ba đều truy vấn JSON, nhưng ngữ pháp và mục tiêu của chúng khác nhau. JMESPath là tiêu chuẩn AWS CLI / SDK: chặt chẽ hơn JSONPath, không có duyệt đệ quy, được xây dựng cho projection không có side-effect có thể đoán trước. jq là ngôn ngữ kịch bản Turing-complete không chỉ truy vấn JSON mà còn biến đổi, rút gọn và stream nó. JSONPath nằm giữa chúng: biểu đạt hơn JMESPath nhờ duyệt đệ quy và bộ lọc, nhẹ hơn jq, và cú pháp được hỗ trợ rộng rãi nhất trong công cụ kiểm tra đa mục đích (Postman, Playwright, REST Assured, kubectl, Step Functions). Trình kiểm tra này triển khai JSONPath.

Trình kiểm tra này dùng phương ngữ nào?

Trình kiểm tra này chạy jsonpath-plus 9.x. Thư viện đó triển khai đặc tả Goessner 2007, bao phủ hầu hết RFC 9535 và thêm các toán tử mở rộng như kiểm tra kiểu (@.string(), @.number(), @.boolean()) và điều hướng cha (^). Cờ preventEval: true luôn được đặt, vì vậy vị từ lọc chạy qua bộ phiên dịch an toàn thay vì JavaScript eval() tích hợp. Truy vấn được dán không thể thực thi mã tùy ý trên trang này.

Có thể sao chép các giá trị khớp riêng lẻ không?

Có. Nút Sao chép vào bộ nhớ tạm sao chép toàn bộ khối kết quả dưới dạng mảng JSON. Để lấy một giá trị duy nhất, chuyển chế độ đầu ra sang Giá trị, rồi chọn dòng bạn muốn trong textarea kết quả và dùng phím tắt sao chép thông thường của trình duyệt (Ctrl/Cmd + C). Đầu ra là văn bản JSON thuần túy, vì vậy nó dán sạch vào trình soạn thảo mã, terminal, kiểm tra Postman hay tin nhắn Slack.