ToolDeck

Công cụ kiểm tra JSONPath

Kiểm tra biểu thức JSONPath với dữ liệu JSON và xem kết quả khớp

Thử ví dụ

Đầu vào JSON

Kết quả

Chạy cục bộ · An toàn để dán thông tin bí mật
Kết quả sẽ hiển thị ở đây…

JSONPath là gì?

JSONPath là ngôn ngữ truy vấn dùng để trích xuất các giá trị từ tài liệu JSON. Ban đầu được Stefan Goessner đề xuất vào năm 2007 như một tương đương của XPath dành cho XML, JSONPath cho phép bạn viết các biểu thức như $.store.book[*].author để chọn tất cả các trường author bên trong một mảng book mà không cần viết vòng lặp hay mã duyệt thủ công. Ngôn ngữ này được chuẩn hóa vào tháng 2 năm 2024 theo RFC 9535, được công bố bởi IETF.

Một biểu thức JSONPath luôn bắt đầu bằng $ đại diện cho gốc của tài liệu. Từ đó bạn nối các bộ chọn: ký hiệu dấu chấm cho khóa đối tượng, ký hiệu ngoặc vuông cho chỉ số mảng, ký tự đại diện cho tất cả phần tử con, và toán tử đệ quy (..) để tìm kiếm qua mọi cấp độ lồng nhau. Biểu thức lọc như [?(@.price < 10)] cho phép chọn các phần tử dựa trên điều kiện đánh giá theo giá trị của chúng.

JSONPath được sử dụng trong các công cụ kiểm thử API như Postman, các nền tảng quan sát như Datadog và Splunk, các engine quy trình làm việc như Apache NiFi, và các thư viện lập trình trên JavaScript, Python, Go, Java và C#. Việc kiểm tra biểu thức với dữ liệu thực trước khi nhúng vào code hay file cấu hình giúp tránh lỗi âm thầm khi cấu trúc JSON không khớp với giả định của bạn.

Tại sao dùng công cụ kiểm tra JSONPath này?

Viết biểu thức JSONPath bằng tay rất dễ mắc lỗi. Một dấu chấm bị thiếu, loại ngoặc sai, hoặc cú pháp bộ lọc không đúng có thể trả về kết quả trống mà không có thông báo lỗi. Công cụ này cung cấp phản hồi trực quan tức thì về những gì biểu thức của bạn khớp.

Kết quả tức thì
Dán JSON, nhập biểu thức và xem các giá trị khớp cập nhật theo thời gian thực. Không cần chạy script hay tải lại trang để kiểm tra truy vấn.
🔒
Ưu tiên quyền riêng tư
Toàn bộ quá trình đánh giá chạy trong trình duyệt của bạn. Dữ liệu JSON không bao giờ rời khỏi máy bạn, vì vậy bạn có thể an toàn kiểm tra biểu thức với phản hồi API production hoặc file cấu hình chứa thông tin xác thực.
📋
Sao chép kết quả trực tiếp
Sao chép kết quả khớp dưới dạng JSON chỉ với một cú nhấp. Dán vào các xác nhận kiểm thử, tài liệu, hoặc ví dụ phản hồi API mà không cần định dạng lại.
🛠️
Không cần cài đặt
Không cần cài package npm hay tạo virtualenv Python. Mở trang, dán dữ liệu và bắt đầu truy vấn. Hoạt động trên mọi thiết bị có trình duyệt.

Các trường hợp sử dụng JSONPath

Phát triển Frontend
Trích xuất chính xác các giá trị lồng nhau bạn cần từ phản hồi API trước khi đưa vào React state hay Vue computed properties. Hãy kiểm tra biểu thức path với payload API thực trước.
Kiểm thử API Backend
Postman và REST-assured dùng JSONPath để xác nhận nội dung phản hồi. Xây dựng và xác minh biểu thức xác nhận ở đây trước khi sao chép vào test script, giảm số vòng debug.
Cấu hình DevOps
Các định nghĩa custom resource của Kubernetes, AWS Step Functions và Terraform data sources chấp nhận biểu thức JSONPath để trích xuất giá trị từ JSON output. Hãy xác thực path trước khi triển khai.
Tự động hóa kiểm thử QA
Viết các xác nhận dựa trên JSONPath cho contract test và integration test. Xác minh rằng biểu thức của bạn khớp đúng với giá trị mong đợi khi cấu trúc JSON có các trường tùy chọn hoặc có thể null.
Trích xuất trong Data Pipeline
Apache NiFi, Logstash và các ETL script tùy chỉnh dùng JSONPath để trích xuất trường từ dữ liệu log bán cấu trúc và event stream. Kiểm tra biểu thức với payload mẫu trước khi triển khai pipeline.
Học tập và thực nghiệm
Sinh viên và lập trình viên mới làm quen với JSONPath có thể thử các biểu thức khác nhau trên JSON mẫu để hiểu cách wildcard, đệ quy và bộ lọc hoạt động mà không cần môi trường cục bộ.

Tài liệu tham khảo cú pháp JSONPath

RFC 9535 định nghĩa cú pháp JSONPath chuẩn. Bảng dưới đây bao gồm các toán tử bạn sẽ sử dụng trong hầu hết các truy vấn. Tất cả biểu thức bắt đầu bằng $ (node gốc) và nối một hoặc nhiều bộ chọn để điều hướng cấu trúc tài liệu.

Toán tửMô tảVí dụ
$Root element$.store
.keyChild property$.store.book
[n]Array index (zero-based)$.store.book[0]
[*]All elements in array/object$.store.book[*]
..Recursive descent$..author
[start:end]Array slice$.store.book[0:2]
[?()]Filter expression$.store.book[?(@.price<10)]
@Current node (inside filter)$.store.book[?(@.isbn)]

JSONPath so với jq so với XPath

JSONPath, jq và XPath giải quyết cùng một vấn đề (truy vấn dữ liệu có cấu trúc) cho các định dạng và trường hợp sử dụng khác nhau. JSONPath nhắm vào JSON và có thể dùng như thư viện trong hầu hết các ngôn ngữ. jq là công cụ CLI độc lập với ngôn ngữ lọc Turing-complete riêng. XPath hoạt động trên XML và là một phần của bộ đặc tả W3C.

Tính năngJSONPathjqXPath
Định dạng dữ liệuJSONJSONXML
Truy cập phần tử đầu tiên$.store.book[0].store.book[0]/store/book[1]
Tìm kiếm đệ quy$..price.. | .price?//price
Biểu thức lọc[?(@.price<10)]select(.price < 10)[price<10]
Đặc tảRFC 9535stedolan.github.ioW3C XPath 3.1

Ví dụ code

Cách đánh giá biểu thức JSONPath trong các ngôn ngữ và công cụ phổ biến. Mỗi ví dụ sử dụng cùng cấu trúc JSON bookstore để so sánh.

JavaScript (jsonpath-plus)
import { JSONPath } from 'jsonpath-plus';

const data = {
  store: {
    book: [
      { title: 'Moby Dick', price: 8.99 },
      { title: 'The Great Gatsby', price: 12.99 }
    ]
  }
};

// Get all book titles
JSONPath({ path: '$.store.book[*].title', json: data });
// → ['Moby Dick', 'The Great Gatsby']

// Recursive descent — find every price in the document
JSONPath({ path: '$..price', json: data });
// → [8.99, 12.99]

// Filter — books under $10
JSONPath({ path: '$.store.book[?(@.price < 10)]', json: data });
// → [{ title: 'Moby Dick', price: 8.99 }]
Python (jsonpath-ng)
from jsonpath_ng.ext import parse
import json

data = {
    "store": {
        "book": [
            {"title": "Moby Dick", "price": 8.99},
            {"title": "The Great Gatsby", "price": 12.99}
        ]
    }
}

# Get all book titles
expr = parse("$.store.book[*].title")
titles = [match.value for match in expr.find(data)]
# → ['Moby Dick', 'The Great Gatsby']

# Recursive descent — all prices
expr = parse("$..price")
prices = [match.value for match in expr.find(data)]
# → [8.99, 12.99]

# Filter — books under $10
expr = parse("$.store.book[?price < 10]")
cheap = [match.value for match in expr.find(data)]
# → [{"title": "Moby Dick", "price": 8.99}]
Go (ohler55/ojg)
package main

import (
    "fmt"
    "github.com/ohler55/ojg/jp"
    "github.com/ohler55/ojg/oj"
)

func main() {
    src := `{
        "store": {
            "book": [
                {"title": "Moby Dick", "price": 8.99},
                {"title": "The Great Gatsby", "price": 12.99}
            ]
        }
    }`

    obj, _ := oj.ParseString(src)

    // Get all book titles
    expr, _ := jp.ParseString("$.store.book[*].title")
    results := expr.Get(obj)
    fmt.Println(results)
    // → [Moby Dick The Great Gatsby]

    // Recursive descent — all prices
    expr2, _ := jp.ParseString("$..price")
    fmt.Println(expr2.Get(obj))
    // → [8.99 12.99]
}
CLI (jq alternative syntax)
# jq uses its own syntax, not JSONPath, but solves the same problem.
# Mapping common JSONPath patterns to jq:

# $.store.book[*].title → get all titles
echo '{"store":{"book":[{"title":"Moby Dick"},{"title":"Gatsby"}]}}' | \
  jq '.store.book[].title'
# → "Moby Dick"
# → "Gatsby"

# $..price → recursive descent for "price" keys
echo '{"a":{"price":1},"b":{"price":2}}' | \
  jq '.. | .price? // empty'
# → 1
# → 2

# Filter: books where price < 10
echo '{"store":{"book":[{"title":"A","price":8},{"title":"B","price":12}]}}' | \
  jq '.store.book[] | select(.price < 10)'
# → {"title":"A","price":8}

Câu hỏi thường gặp

Sự khác biệt giữa JSONPath và jq là gì?
JSONPath là ngôn ngữ truy vấn được thiết kế để nhúng vào ứng dụng dưới dạng thư viện. Nó trả về các giá trị khớp từ tài liệu JSON bằng biểu thức path. jq là công cụ dòng lệnh độc lập với ngôn ngữ lập trình đầy đủ để biến đổi JSON, bao gồm điều kiện, hàm và nội suy chuỗi. Dùng JSONPath khi cần nhúng truy vấn vào code hoặc công cụ như Postman. Dùng jq cho việc biến đổi dữ liệu tại dòng lệnh.
JSONPath có phải là tiêu chuẩn chính thức không?
Có. IETF đã công bố RFC 9535 ("JSONPath: Query Expressions for JSON") vào tháng 2 năm 2024. Trước đó, JSONPath chỉ tồn tại như một đặc tả không chính thức của Stefan Goessner từ năm 2007, dẫn đến sự không nhất quán giữa các triển khai. RFC 9535 định nghĩa cú pháp, ngữ nghĩa và định dạng chuẩn hóa để đảm bảo khả năng tương tác.
Toán tử đệ quy (..) trong JSONPath hoạt động như thế nào?
Toán tử đệ quy (..) tìm kiếm toàn bộ các cấp độ của tài liệu JSON để lấy khóa theo sau nó. Ví dụ, $..price trả về tất cả giá trị liên kết với khóa "price" bất kể chúng được lồng sâu đến đâu. Nó tương đương với duyệt theo chiều sâu (depth-first) thu thập các node khớp. Lưu ý rằng với tài liệu lớn, đệ quy có thể trả về nhiều kết quả và có thể chậm hơn so với path trực tiếp.
JSONPath có thể sửa đổi dữ liệu JSON không?
Không. JSONPath là ngôn ngữ truy vấn chỉ đọc. Nó chọn và trả về các giá trị nhưng không thể chèn, cập nhật hay xóa node. Để sửa đổi JSON dựa trên biểu thức JSONPath, bạn cần dùng các hàm thao tác JSON của ngôn ngữ lập trình sau khi truy vấn. Một số thư viện như jsonpath-ng trong Python cung cấp phương thức set() trên các đối tượng khớp, nhưng đây là phần mở rộng của thư viện, không phải một phần của đặc tả JSONPath.
Ký hiệu @ có nghĩa gì trong biểu thức lọc JSONPath?
Ký hiệu @ đề cập đến node hiện tại đang được đánh giá trong biểu thức lọc. Trong $.store.book[?(@.price < 10)], bộ lọc lặp qua từng phần tử của mảng book, và @ đại diện cho từng đối tượng book lần lượt. @.price truy cập trường price của book hiện tại. Nếu không có @, bộ lọc sẽ không biết cần kiểm tra thuộc tính của node nào.
Làm thế nào để xử lý các khóa có ký tự đặc biệt hoặc khoảng trắng trong JSONPath?
Dùng ký hiệu ngoặc vuông có dấu nháy: $['store']['book title']. Ký hiệu ngoặc vuông hoạt động với mọi khóa, bao gồm cả những khóa có dấu chấm, khoảng trắng hay ký tự Unicode. Ký hiệu dấu chấm ($.store.key) chỉ hoạt động với các khóa là định danh hợp lệ (chữ cái, chữ số, dấu gạch dưới). RFC 9535 yêu cầu các triển khai phải hỗ trợ cả ký hiệu ngoặc vuông có dấu nháy đơn và dấu nháy kép.
Tại sao biểu thức JSONPath của tôi trả về kết quả trống?
Các nguyên nhân phổ biến nhất là: lỗi đánh máy trong tên khóa (JSONPath phân biệt chữ hoa/thường), dùng ký hiệu dấu chấm cho khóa có ký tự đặc biệt, thiếu ký hiệu $ gốc ở đầu, hoặc nhầm tưởng một giá trị là mảng trong khi thực ra là một đối tượng đơn. Hãy dán JSON vào công cụ kiểm tra và thử các biểu thức con đơn giản hơn trước (như $.store) để xác minh từng phần của path được phân giải đúng trước khi thêm nhiều bộ chọn hơn.