JSON Toolkit

JSONPath hay JSON Pointer

Kết luận: JSON Pointer là một địa chỉ duy nhất có thể lưu làm khóa; JSONPath là một ngôn ngữ truy vấn. Dùng sai loại sẽ làm hỏng cập nhật cấu hình hoặc tự tạo ra một JSONPath hỏng.

Trung cấpĐọc khoảng 4 phútXuất bản 2026-10-30Cập nhật 2026-10-30
Nơi JSONPath kết thúc và JSON Pointer bắt đầu

Tóm lại: dùng JSON Pointer khi bạn cần đọc, ghi hoặc lưu địa chỉ của một node (ví dụ /server/cors/0), và JSONPath khi bạn cần chọn một tập node theo điều kiện; bất kỳ đường dẫn nào được lưu lại nên là Pointer, không bao giờ là biểu thức.

Hãy hỏi xem bạn cần một node hay một tập node.

Gói trong một bảng

JSON Pointer JSONPath
Bản chất Địa chỉ duy nhất Biểu thức truy vấn
Cú pháp /a/b/0 $.a.b[0], $..price
Kết quả Đúng một node, hoặc không có Không hoặc nhiều node
Lưu được làm khóa Có, chuỗi chính là danh tính Không, có thể khớp nhiều node
Chuẩn RFC 6901 RFC 9535 (hoàn thiện năm 2024)

JSON Pointer

/server/host        -> "127.0.0.1"
/server/cors/0      -> "https://a.com"
/                   -> the whole document

Các khóa chứa / hoặc ~ được escape: ~0 cho ~, ~1 cho /. Giá trị nằm ở tính xác định: địa chỉ là một chuỗi, nên nó vừa với một cột cơ sở dữ liệu, một dòng log, hay một khóa cấu hình. JSON Patch (RFC 6902) địa chỉ hóa mọi thao tác theo cách này.

JSONPath

$.store.book[*].author
$..price
$.store.book[?(@.price < 10)]

Gần với WHERE của SQL. Cùng một biểu thức trả về không, một hay một trăm node tùy dữ liệu.

Hai kiểu thất bại

Dùng JSONPath làm khóa cấu hình. Lưu $.server.port và một ngày nào đó cấu trúc trở thành mảng; biểu thức giờ khớp nhiều port và logic cập nhật không có cách nào chọn đúng.

Dùng Pointer để chọn lọc. "Tìm mọi node có giá dưới 10" là điều bất khả với một pointer. Tự viết vòng lặp nghĩa là bạn đang dựng một JSONPath thiếu hoàn chỉnh.

Các hệ thống thật chia việc thế nào

  • Đọc cấu hình, cập nhật trường, patch: Pointer, cố định và kiểm toán được
  • Khám phá dữ liệu, trích xuất hàng loạt, báo cáo: JSONPath, ưu tiên khả năng diễn đạt
  • Bất cứ thứ gì được lưu lại: chỉ Pointer, không bao giờ là biểu thức

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

Tôi nên chọn JSON Pointer hay JSONPath thế nào?

Hãy hỏi xem bạn cần một node hay một tập. Dùng JSON Pointer để đọc hoặc ghi một node cụ thể và để lưu địa chỉ đó làm khóa, vì pointer là duy nhất, ví dụ /server/cors/0. Dùng JSONPath để chọn node theo điều kiện, ví dụ $.store.book[?(@.price < 10)].

Vì sao không thể dùng biểu thức JSONPath làm khóa cấu hình?

Vì biểu thức có thể khớp nhiều node. Lưu $.server.port và một ngày nào đó cấu trúc trở thành mảng; biểu thức khi đó khớp nhiều port và logic cập nhật không quyết định được node nào cần thay đổi. Bất cứ thứ gì được lưu lại hoặc kiểm toán đều cần một Pointer.

JSON Pointer có thể lọc node theo điều kiện không?

Không. Pointer chỉ đi theo một đường dẫn cố định và không có cách nào biết những node nào tồn tại, nên việc chọn mọi node có giá dưới 10 là bất khả. Tự viết vòng lặp đó nghĩa là bạn đang dựng một JSONPath thiếu hoàn chỉnh.

Đọc thêm