So sánh & vá JSON API
So sánh hai tài liệu JSON theo cấu trúc, sinh JSON Patch (RFC 6902) và Merge Patch (RFC 7386); áp dụng patch vào tài liệu.
API so sánh JSON đối chiếu hai giá trị JSON theo cấu trúc chứ không theo văn bản: thứ tự khoá và cách định dạng không ảnh hưởng. action=diff (với a và b) cho biết hai bên có bằng nhau không, tóm tắt số giá trị thêm, xoá, thay thế, một JSON Patch theo RFC 6902 biến a thành b và Merge Patch tương đương theo RFC 7386, định dạng mà nhiều REST API dùng cho request PATCH.
action=patch áp dụng một JSON Patch (add, remove, replace, move, copy, test) vào tài liệu và trả về kết quả; thao tác test sai hoặc đường dẫn không tồn tại trả về 422 kèm vị trí thao tác, giúp kiểm tra patch trước khi ghi vào cơ sở dữ liệu. action=merge áp dụng Merge Patch (null để xoá khoá).
Mảng được so sánh sau khi bỏ phần đầu và cuối giống nhau, nên thêm hoặc bớt phần tử cho ra patch ngắn. Đường dẫn dùng JSON Pointer với ký tự thoát ~0 / ~1.
Tham số
| Tên | Vị trí | Kiểu | Bắt buộc | Mặc định | |
|---|---|---|---|---|---|
action | body | string | không | diff | diff, patch hoặc merge. |
a | body | object | không | Với diff: JSON gốc. | |
b | body | object | không | Với diff: JSON mới. | |
json | body | object | không | Với patch / merge: tài liệu cần vá. | |
patch | body | array | không | Các thao tác RFC 6902. | |
merge_patch | body | object | không | Merge patch RFC 7386. |
Ví dụ
curl -X POST "https://apibox.io.vn/v1/json-diff" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"a":{"name":"A","tags":["x"],"n":{"a":1,"b":2}},"b":{"name":"B","tags":["x","y"],"n":{"a":1}}}'const res = await fetch('https://apibox.io.vn/v1/json-diff', {
method: 'POST',
headers: {
Authorization: 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"a": {
"name": "A",
"tags": [
"x"
],
"n": {
"a": 1,
"b": 2
}
},
"b": {
"name": "B",
"tags": [
"x",
"y"
],
"n": {
"a": 1
}
}
}),
});
const data = await res.json();
console.log(data);import requests
res = requests.post(
"https://apibox.io.vn/v1/json-diff",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={"a": {"name": "A", "tags": ["x"], "n": {"a": 1, "b": 2}}, "b": {"name": "B", "tags": ["x", "y"], "n": {"a": 1}}},
timeout=30,
)
print(res.json())<?php
$ch = curl_init('https://apibox.io.vn/v1/json-diff');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => ['Authorization: Bearer YOUR_API_KEY', 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => '{"a":{"name":"A","tags":["x"],"n":{"a":1,"b":2}},"b":{"name":"B","tags":["x","y"],"n":{"a":1}}}',
]);
$response = curl_exec($ch);
print_r(json_decode($response, true));Kết quả trả về
{
"equal": false,
"summary": {
"added": 1,
"removed": 1,
"replaced": 1
},
"patch": [
{
"op": "replace",
"path": "/name",
"value": "B"
},
{
"op": "add",
"path": "/tags/1",
"value": "y"
},
{
"op": "remove",
"path": "/n/b"
}
],
"merge_patch": {
"name": "B",
"tags": [
"x",
"y"
],
"n": {
"b": null
}
}
}
Ứng dụng
- Hiển thị thay đổi giữa hai phản hồi API hoặc hai phiên bản cấu hình
- Sinh body cho request PATCH từ object đã chỉnh sửa
- Nhật ký kiểm toán chỉ lưu phần thay đổi
- Kiểm tra và áp dụng patch do client gửi lên
Hỏi đáp
JSON Patch hay Merge Patch?
JSON Patch là danh sách thao tác chính xác (kể cả vị trí trong mảng và phép kiểm tra). Merge Patch là tài liệu một phần: đơn giản hơn nhưng không đặt được giá trị null hay sửa một phần mảng.
Thứ tự khoá có quan trọng không?
Không. {"a":1,"b":2} bằng {"b":2,"a":1}. Thứ tự phần tử trong mảng thì có.
Patch lỗi thì sao?
Không thao tác nào được áp dụng; API trả HTTP 422 với mã patch_failed và vị trí thao tác bị lỗi.
API liên quan
Kiểm tra JSON
Kiểm tra cú pháp JSON, báo đúng dòng và cột bị lỗi, và validate dữ liệu theo JSON Schema (draft 4, 7, 2019-09 hoặc 2020-12).
{ }Định dạng JSON
Làm đẹp JSON với thụt lề 0-8 dấu cách hoặc tab, rút gọn (minify) hoặc sắp xếp key theo bảng chữ cái. Báo lỗi cú pháp kèm dòng và cột.
CSVCSV sang JSON
Chuyển CSV thành mảng object JSON theo dòng tiêu đề, tự nhận dấu phân cách, tự chuyển số và boolean, báo lỗi từng dòng.