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.

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.