Trình tạo JSON Patch
So sánh hai tài liệu JSON và nhận bản vá RFC 6902 biến tài liệu thứ nhất thành tài liệu thứ hai. Mọi thứ đều chạy trong trình duyệt.
Công cụ này làm gì
Nó so sánh hai tài liệu JSON và viết ra danh sách thao tác biến tài liệu thứ nhất thành tài liệu thứ hai, theo đúng định dạng RFC 6902 quy định. Thay vì gửi cả một tài liệu chỉ để báo rằng một trường đã đổi, bạn gửi chính thay đổi đó.
Khi nào nên dùng
Để dựng phần thân của một yêu cầu PATCH, để ghi lại những gì đã đổi giữa hai phiên bản của một tệp cấu hình, hoặc để lưu một dấu vết kiểm toán nhỏ hơn rất nhiều so với việc giữ từng bản sao đầy đủ. Đây cũng là cách nhanh để biết hai tài liệu trông giống nhau thực ra khác nhau ở đâu.
Những thao tác nó tạo ra
| Thao tác | Ý nghĩa |
|---|---|
| add | Thêm một giá trị vào chỗ trước đó chưa có, hoặc chèn vào một mảng. |
| remove | Xoá giá trị ở vị trí đó. |
| replace | Ghi đè giá trị ở một vị trí đã tồn tại. |
| move | Chuyển một giá trị từ vị trí này sang vị trí khác. |
| copy | Sao chép một giá trị sang vị trí khác. |
| test | Kiểm tra một giá trị và huỷ toàn bộ bản vá nếu không khớp. |
Công cụ này chỉ viết add, remove và replace. Ba thao tác ấy đủ để diễn đạt mọi thay đổi, và một bản vá đọc được từng dòng thì đáng giá hơn một bản vá ngắn hơn nhưng phải vắt óc. Ba thao tác còn lại cũng thuộc RFC 6902 và mọi máy chủ tuân thủ đều chấp nhận.
Các đường dẫn hoạt động ra sao
Mỗi đường dẫn là một JSON Pointer (RFC 6901): một lối đi ngăn cách bằng dấu gạch chéo tính từ gốc tài liệu, trong đó “/address/zipCode” nghĩa là trường zipCode bên trong address. Vị trí trong mảng là số, nên “/skills/0” là phần tử đầu tiên, còn dấu gạch ngang nghĩa là cuối mảng: “/skills/-” thêm vào cuối. Vì dấu gạch chéo là ký tự ngăn cách, một khoá có chứa nó được viết là ~1, và dấu ngã thật thì viết là ~0.
Lưu ý về kết quả
Việc so sánh là theo nghĩa đen: các giá trị được đối chiếu theo từng vị trí, nên chèn một phần tử vào đầu mảng sẽ sinh ra replace cho mọi phần tử phía sau thay vì một lần chèn duy nhất. Với mảng các đối tượng có định danh ổn định, bản vá dựng từ định danh luôn nhỏ hơn bản vá dựng từ vị trí.
Cách tạo một JSON Patch
Dán hai tài liệu JSON rồi tạo bản vá.
- Dán JSON gốc vào bên trái.
- Dán JSON đã sửa vào bên phải.
- Bấm Tạo, rồi sao chép bản vá.
Câu hỏi thường gặp
Công cụ này có gửi dữ liệu của tôi đi đâu không?
Không. Cả hai tài liệu đều ở lại trong trình duyệt và bản vá được tạo trên chính máy của bạn.
Kết quả có tuân thủ RFC 6902 không?
Có. Mỗi thao tác là một đối tượng có op, path và — với add và replace — value, còn các đường dẫn là JSON Pointer đúng như RFC 6901 định nghĩa.
Có kèm thao tác move và copy không?
Không. Công cụ viết add, remove và replace, đủ để diễn đạt mọi thay đổi và dễ đọc hơn nhiều. Một thao tác move chẳng qua là remove rồi đến add.
Tôi áp dụng bản vá thế nào?
Gửi nó tới một API nhận application/json-patch+json, hoặc dùng một thư viện: jsonpatch trong Python, json-patch trong JavaScript, JsonPatchDocument trong .NET, json-patch trong Java, v.v.
Khác gì so với JSON Merge Patch?
JSON Merge Patch (RFC 7386) trông giống chính tài liệu, với null mang nghĩa “xoá”. Điều đó khiến nó dễ đọc nhưng không thể lưu một null thật, cũng không thể đụng tới riêng một phần tử của mảng. JSON Patch dài dòng hơn nhưng diễn đạt được mọi thứ.
Wikipedia — JSON Patch
Wikipedia — JSON
Wikipedia — Patch (computing)
Wikipedia — Diff
Wikipedia — REST