- JSON Patch là một định dạng tiêu chuẩn được định nghĩa trong RFC 6902, dùng để sửa đổi tài liệu JSON
- Cung cấp một cách đơn giản và hiệu quả để cập nhật một phần tài nguyên qua HTTP
- Các phương thức
PUT và POST trước đây phải gửi toàn bộ dữ liệu, trong khi phương thức PATCH cho phép cập nhật từng phần
- JSON Patch cung cấp cách biểu đạt thay đổi rõ ràng và ngắn gọn cho tài liệu JSON, giúp giảm băng thông và cải thiện hiệu năng của ứng dụng web
Cách JSON Patch hoạt động
- JSON Patch hoạt động như một chuỗi các thao tác nguyên tử trên tài liệu JSON.
- Mỗi thao tác bao gồm trường
op và trường path, dùng để thực hiện thao tác tại một vị trí cụ thể trong tài liệu.
- Ví dụ, thao tác
add thêm một trường mới, còn thao tác replace thay thế một trường hiện có.
JSON Pointer
- JSON Patch sử dụng JSON Pointer để xác định một phần cụ thể của tài liệu.
- JSON Pointer là một chuỗi token được phân tách bằng dấu gạch chéo (
/), dùng để xác định cấu trúc phân cấp của tài liệu.
- Ví dụ,
/user/name xác định trường name trong đối tượng user.
Ưu và nhược điểm của JSON Patch
Ưu điểm
- Độ chính xác: Có thể sửa chính xác các phần tử cụ thể trong cấu trúc phức tạp.
- Hiệu quả: Chỉ truyền các thay đổi, giúp giảm lượng dữ liệu truyền và độ trễ.
- Tính nguyên tử: Có thể rollback toàn bộ thao tác nếu xảy ra lỗi.
- Tính idempotent: Có thể thử lại một cách an toàn.
- Thao tác phức tạp: Có thể di chuyển hoặc sao chép phần tử.
- Xác thực: API có thể xác thực patch đầu vào để giảm các yêu cầu không hợp lệ.
- Dựa trên tiêu chuẩn: Dễ tích hợp với nhiều client và server khác nhau.
- Kiểm soát truy cập ở mức trường: Có thể giới hạn chỉnh sửa ở mức chi tiết.
- Xử lý hàng loạt: Có thể xử lý nhiều thay đổi trong một yêu cầu.
Nhược điểm
- Độ phức tạp: Khó xử lý các cấu trúc JSON phức tạp.
- Chi phí bảo trì: Đường dẫn có thể trở nên không còn hợp lệ khi API phát triển.
- Khó debug: Việc theo dõi trở nên khó hơn khi nhiều thao tác được gộp chung.
- Bảo toàn thứ tự đối tượng: Thao tác di chuyển không đảm bảo thứ tự của đối tượng.
- Vấn đề bảo mật: Có thể phát sinh lỗ hổng nếu xử lý yêu cầu không đúng cách.
Ví dụ về các thao tác JSON Patch
- Add: Thêm một trường mới.
- Remove: Xóa một trường hiện có.
- Replace: Thay thế một trường hiện có bằng giá trị mới.
- Move: Di chuyển phần tử sang vị trí khác.
- Copy: Sao chép phần tử sang vị trí khác.
- Test: Kiểm tra xem một giá trị có được thiết lập tại đường dẫn cụ thể hay không.
JSON Patch trong công cụ và thư viện
- Có nhiều thư viện hỗ trợ JSON Patch trong các ngôn ngữ lập trình khác nhau: fast-json-patch, python-json-patch, JsonPatch library in .NET, v.v.
- Một công cụ rất tốt để học JSON Patch là jsonpatch.me, dịch vụ trực tuyến miễn phí để chạy các lệnh JSON Patch. Ngoài ra còn có API
Tổng kết của GN⁺
- JSON Patch là một công cụ mạnh mẽ để thực hiện cập nhật từng phần đối với tài liệu JSON một cách hiệu quả.
- Dù có thể gặp khó khăn khi xử lý cấu trúc JSON phức tạp, điều này có thể được khắc phục nhờ nhiều thư viện và công cụ khác nhau.
- JSON Patch hữu ích trong việc giảm lượng dữ liệu truyền và cải thiện hiệu năng của ứng dụng web.
- Cũng có thể cân nhắc các lựa chọn thay thế như JSON Merge Patch, và việc sử dụng JSON Patch trong phát triển API có thể giúp tăng hiệu quả.
1 bình luận
Ý kiến trên Hacker News
JSON Patch được thiết kế để có thể sửa mọi tài liệu JSON nên tạo cảm giác phức tạp. Nếu giới hạn nhẹ tập dữ liệu thì có thể vá tài liệu theo cách đơn giản hơn. Ví dụ, trong Firebase không thể lưu giá trị null, và đặt thành null có nghĩa là xóa. Những ràng buộc đơn giản như vậy giúp việc triển khai PATCH trở nên dễ dàng. Đây là một đặc điểm rất hay của API vì ngoài việc hiểu rằng "null nghĩa là xóa" thì không cần học thêm gì mới.
Việc dùng
/làm dấu phân tách của JSON là một lựa chọn kỳ lạ. JSON là tập con của JS nên tôi đã mong đợi.sẽ là dấu phân tách. Khi nhìn thấy/, tôi có cảm giác đây là một đặc tả do phía backend viết ra, và họ dường như muốn biến đường dẫn thành URL để giải quyết sự mơ hồ giữa đường dẫn tương đối và tuyệt đối.Tôi nghĩ đường dẫn nên là mảng thay vì chuỗi. Nếu không, phải escape
/trong key và phải phân tích cú pháp chuỗi đường dẫn. Điều đó khiến nó không thể xử lý các tài liệu JSON tùy ý.Tôi đã từng dùng JSON Patch như một cách chắp vá để nhanh chóng giải quyết một vấn đề bất ngờ. Chúng tôi đã xây dựng một giao diện web để các nhà thầu ở nước ngoài có thể chú thích dữ liệu văn bản ở mức từ. Dữ liệu lẽ ra sẽ được chú thích theo từng đoạn nhỏ, nhưng lại bị gán theo toàn bộ tài liệu nên chú thích không được lưu. Tôi tìm thấy JSON Patch và đã sửa mã tải lên để chỉ dùng patch.
Trong cách chỉ định đường dẫn của JSON Patch, cần có một cú pháp chuẩn cho phép chọn phần tử trong mảng bằng cặp khóa-giá trị nhận dạng thay vì theo chỉ số. Điều này đặc biệt quan trọng khi thêm phần tử hoặc khi phân tích sự khác biệt của các mục JSON giữa những phiên bản trước.
Một trong những điểm mạnh của JSON Patch là tính idempotent. Các thao tác JSON Patch có thể được thử lại an toàn mà không gây tác dụng phụ ngoài ý muốn. Tuy nhiên, việc không thể thêm phần tử vào mảng khiến tôi ngạc nhiên.
Nó hoạt động tương tự truy vấn cập nhật của MongoDB. Tôi tự hỏi liệu có thể dùng ngôn ngữ cập nhật đó mà không cần chạy toàn bộ MongoDB trên tệp cục bộ hay không.
Cần có sự so sánh giữa JSONDiffpatch và JSON Patch. JSONDiffpatch hoạt động tốt trên trình duyệt cũng như trong node/Cloudflare Workers.
Tôi đã gặp khó khăn khi thuyết phục các đối tác bên ngoài học JSON Patch. Chúng tôi dùng nó trong API hướng đến khách hàng, và đã phải bỏ ra rất nhiều công sức để người dùng hiểu và chấp nhận.
Đặc tả JSON Pointer mang cảm giác rất "URL-y", như thể có thể bỏ qua một lớp cú pháp meta-JSON.
testvàcopylà những điểm riêng có trong đặc tả JSON Patch, và cũng có thể thực hiện nhiều chỉnh sửa cùng lúc theo kiểu "transaction".