Công Cụ So Sánh JSON - So Sánh JSON Trực Tuyến Miễn Phí | JSON Diff
So sánh JSON trực tuyến miễn phí với công cụ so sánh JSON nhanh chóng của chúng tôi. Tìm sự khác biệt ngay lập tức với kết quả được mã màu. JSON diff 100% an toàn, chạy trên trình duyệt. Không cần đăng ký.
Công Cụ So Sánh JSON
Tài liệu hướng dẫn
Một công cụ so sánh JSON, thường được gọi là công cụ diff JSON, so sánh hai giá trị JSON (JavaScript Object Notation) và báo cáo những gì đã thay đổi giữa chúng. Công cụ liệt kê mọi thuộc tính hoặc phần tử mảng được thêm, xóa hoặc sửa đổi, cùng với vị trí chính xác của chúng trong dữ liệu. Trang này giải thích cách công cụ so sánh JSON của whiz.tools hoạt động, với các ví dụ minh họa dựa trên logic so sánh thực tế của công cụ.
So sánh JSON là gì?
So sánh JSON là quá trình đối chiếu hai tài liệu JSON để tìm ra điểm khác biệt. Tài liệu JSON là một đoạn văn bản được tạo thành từ các đối tượng (cặp khóa-giá trị trong dấu ngoặc nhọn), mảng (danh sách có thứ tự trong dấu ngoặc vuông) và các giá trị nguyên thủy như chuỗi, số, giá trị Boolean và null. Việc so sánh bằng mắt hai tài liệu này sẽ chậm và dễ xảy ra lỗi khi chúng dài quá vài dòng, vì vậy công cụ so sánh tự động thực hiện việc đối chiếu và làm nổi bật từng thay đổi.
Các nhà phát triển sử dụng kiểu so sánh này để kiểm tra phản hồi API, theo dõi thay đổi trong tệp cấu hình, xác minh rằng quá trình di chuyển dữ liệu không làm mất thông tin và xem xét các thay đổi trong tệp JSON được quản lý bằng hệ thống kiểm soát phiên bản.
Công cụ so sánh hai giá trị JSON như thế nào
Công cụ phân tích cú pháp cả hai đầu vào bằng một trình phân tích JSON tiêu chuẩn, sau đó duyệt đồng thời qua hai giá trị thu được, từng cấp một. Ở mỗi bước, công cụ lần lượt đặt ra ba câu hỏi:
- Hai giá trị có khác kiểu (ví dụ, một giá trị là đối tượng còn giá trị kia là số), hoặc một giá trị là
nullcòn giá trị kia không phải không? Nếu có, công cụ ghi nhận một sửa đổi tại vị trí đó và dừng việc so sánh sâu hơn. - Cả hai giá trị có phải là giá trị nguyên thủy (chuỗi, số, giá trị Boolean hoặc null) không? Nếu có, công cụ so sánh trực tiếp chúng. Mọi khác biệt, kể cả việc thay đổi từ số
123thành chuỗi"123", đều được tính là một sửa đổi. - Cả hai giá trị có phải là đối tượng hoặc cả hai có phải là mảng không? Nếu có, công cụ so sánh nội dung của chúng theo các quy tắc bên dưới và đệ quy vào mọi đối tượng hoặc mảng lồng nhau.
Mọi khác biệt đều được ghi nhận cùng một đường dẫn, chẳng hạn như user.address.city hoặc tags[1], để dễ dàng tìm thấy trong tài liệu gốc. Các thành viên của đối tượng được nối bằng dấu chấm, còn các phần tử mảng được hiển thị bằng chỉ mục trong dấu ngoặc vuông. Một khác biệt ở cấp cao nhất của tài liệu, chẳng hạn như mảng bị thay thế bằng đối tượng, không có đường dẫn bên trong dữ liệu, nên được gắn nhãn $. Đây là mã định danh gốc được định nghĩa trong RFC 9535, tiêu chuẩn JSONPath, và đại diện cho toàn bộ tài liệu.
So sánh các đối tượng
Với hai đối tượng JSON, công cụ thu thập mọi khóa xuất hiện trong một trong hai đối tượng. Với mỗi khóa:
- Nếu khóa chỉ tồn tại trong đối tượng thứ hai, đó là một thuộc tính được thêm.
- Nếu khóa chỉ tồn tại trong đối tượng thứ nhất, đó là một thuộc tính bị xóa.
- Nếu khóa tồn tại trong cả hai, công cụ đệ quy so sánh hai giá trị.
Thứ tự khóa không quan trọng. Tiêu chuẩn JSON không quy định thứ tự cho các thành viên của đối tượng, vì vậy {"a":1,"b":2} và {"b":2,"a":1} được xem là giống hệt nhau.
So sánh các mảng
Các mảng được so sánh theo vị trí, không phải theo nội dung. Công cụ lần lượt duyệt qua hai mảng theo từng chỉ mục và so sánh phần tử ở mỗi chỉ mục, cho đến độ dài của mảng dài hơn. Nếu một mảng ngắn hơn, các phần tử dư ở cuối mảng dài hơn sẽ được báo cáo là được thêm hoặc bị xóa.
Điều này có nghĩa là công cụ không bao giờ cố gắng đối chiếu các phần tử mảng theo nội dung của chúng. Công cụ không nhận ra rằng một đối tượng đã được "di chuyển" từ chỉ mục 1 sang chỉ mục 2; công cụ chỉ thấy giá trị ở mỗi chỉ mục đã thay đổi. Việc xóa hoặc chèn một phần tử ở giữa mảng làm mọi phần tử theo sau dịch chuyển một vị trí, nên thường được hiển thị thành nhiều sửa đổi riêng biệt thay vì một lần thêm hoặc xóa rõ ràng.
Ví dụ minh họa
Ví dụ 1: so sánh hai đối tượng
JSON thứ nhất:
1{ "user": { "address": { "city": "New York", "zip": "10001" } } }
2JSON thứ hai:
1{ "user": { "address": { "city": "Boston", "zip": "02108" } } }
2Kết quả:
- Đã sửa đổi
user.address.city:"New York"→"Boston" - Đã sửa đổi
user.address.zip:"10001"→"02108"
Ví dụ 2: thay đổi mảng ở cuối
JSON thứ nhất:
1{ "tags": ["important", "urgent", "review"] }
2JSON thứ hai:
1{ "tags": ["important", "critical", "review", "documentation"] }
2Chỉ mục 0 không thay đổi, chỉ mục 1 đã thay đổi, chỉ mục 2 không thay đổi và chỉ mục 3 chỉ tồn tại trong mảng thứ hai. Kết quả:
- Đã sửa đổi
tags[1]:"urgent"→"critical" - Đã thêm
tags[3]:"documentation"
Ví dụ 3: xóa một phần tử ở giữa mảng
Ví dụ này cho thấy điều gì xảy ra khi một phần tử bị xóa khỏi giữa mảng, vì đây là nguyên nhân thường gây nhầm lẫn.
JSON thứ nhất:
1{
2 "products": [
3 { "id": 1, "name": "Laptop", "price": 999.99 },
4 { "id": 2, "name": "Mouse", "price": 24.99 },
5 { "id": 3, "name": "Keyboard", "price": 59.99 }
6 ]
7}
8JSON thứ hai, trong đó mục "Mouse" đã bị xóa và mục "Monitor" được thêm vào cuối:
1{
2 "products": [
3 { "id": 1, "name": "Laptop", "price": 899.99 },
4 { "id": 3, "name": "Keyboard", "price": 59.99 },
5 { "id": 4, "name": "Monitor", "price": 349.99 }
6 ]
7}
8Người nhìn vào dữ liệu này sẽ nói rằng "Mouse đã bị xóa và Monitor đã được thêm vào." Vì công cụ so sánh hoàn toàn theo chỉ mục, nó không nhìn nhận theo cách đó. Công cụ so sánh chỉ mục 0 với chỉ mục 0, chỉ mục 1 với chỉ mục 1 và chỉ mục 2 với chỉ mục 2, nên mọi trường sau phần tử bị xóa đều được đối chiếu với đối tượng không đúng. Kết quả thực tế là bảy sửa đổi:
- Đã sửa đổi
products[0].price:999.99→899.99 - Đã sửa đổi
products[1].id:2→3 - Đã sửa đổi
products[1].name:"Mouse"→"Keyboard" - Đã sửa đổi
products[1].price:24.99→59.99 - Đã sửa đổi
products[2].id:3→4 - Đã sửa đổi
products[2].name:"Keyboard"→"Monitor" - Đã sửa đổi
products[2].price:59.99→349.99
Để kết quả so sánh các danh sách như thế này dễ đọc hơn, hãy sắp xếp hoặc tạo khóa cho cả hai mảng theo cùng một cách trước khi dán chúng vào, chẳng hạn bằng cách viết mỗi danh sách theo cùng thứ tự hoặc đối chiếu các đối tượng theo trường ID trước khi so sánh.
Những việc công cụ không thực hiện
- Công cụ không đối chiếu các phần tử mảng theo nội dung. Như đã trình bày ở trên, công cụ chỉ so sánh theo vị trí chỉ mục, nên không thể nhận ra một phần tử đã được di chuyển thay vì thay đổi.
- Công cụ không phát hiện tham chiếu tuần hoàn. Trên thực tế, đây không phải là một hạn chế: cả hai đầu vào đều xuất phát từ
JSON.parse, hàm này luôn tạo ra một cây thuần túy và không thể tạo ra giá trị tham chiếu ngược về chính nó. Tham chiếu vòng ngay từ đầu không thể tồn tại trong văn bản JSON hợp lệ. - Công cụ không có tùy chọn sắp xếp mảng trước khi so sánh. Sắp xếp lại các phần tử trong dữ liệu đầu vào trước khi dán là cách duy nhất để tránh hiệu ứng dịch chuyển chỉ mục được mô tả ở trên.
Cách sử dụng công cụ
- Dán tài liệu JSON thứ nhất vào ô bên trái và tài liệu thứ hai vào ô bên phải.
- Công cụ tự động so sánh chúng khi cả hai ô đều có văn bản, hoặc nhấp vào Compare để chạy thủ công.
- Đọc danh sách kết quả. Mỗi dòng hiển thị một đường dẫn, chẳng hạn như
user.age, cùng trạng thái được thêm, bị xóa hoặc được sửa đổi, với các giá trị cũ và mới được hiển thị cạnh nhau. - Nhấp vào Copy để sao chép kết quả dưới dạng văn bản thuần túy.
Nếu một ô chứa văn bản không phải JSON hợp lệ, công cụ sẽ hiển thị lỗi bên dưới ô đó thay vì thực hiện so sánh. Khi cả hai ô đều không hợp lệ, cả hai lỗi sẽ xuất hiện cùng lúc.
Các câu hỏi thường gặp
Điều gì được tính là khác biệt giữa hai giá trị JSON?
Một thuộc tính hoặc phần tử mảng được xem là khác nếu nó chỉ tồn tại trong một trong hai tài liệu, hoặc tồn tại trong cả hai nhưng chứa giá trị khác hoặc có kiểu khác. Việc đổi giá trị từ số 5 thành chuỗi "5" được tính là một sửa đổi, dù chúng có thể trông giống nhau.
Thứ tự các phần tử có quan trọng không? Điều này tùy thuộc vào cấu trúc chứa. Đối tượng JSON không có thứ tự thành viên được định nghĩa, nên hai đối tượng có cùng khóa và giá trị nhưng theo thứ tự khác nhau được xem là giống hệt nhau. Mảng có thứ tự, và công cụ so sánh chúng theo vị trí chỉ mục, nên việc chuyển một phần tử sang vị trí khác được báo cáo thành một chuỗi sửa đổi thay vì một lần di chuyển.
Đường dẫn kết quả $ có nghĩa là gì?
Điều đó có nghĩa là toàn bộ tài liệu đã thay đổi, chứ không chỉ một phần của nó. Trường hợp này xảy ra khi hai đầu vào là các kiểu giá trị khác nhau ở cấp cao nhất, chẳng hạn một bên là mảng và bên kia là đối tượng, hoặc hai số đơn 1 và 2. $ là mã định danh gốc trong RFC 9535, tiêu chuẩn JSONPath.
Dữ liệu JSON của tôi có được gửi lên máy chủ không? Không. Việc so sánh chạy trong trình duyệt bằng JavaScript. Không có dữ liệu nào được tải lên.
Định dạng, chẳng hạn như thụt lề hoặc thu gọn, có ảnh hưởng đến kết quả không? Không. Cả hai đầu vào đều được phân tích thành các giá trị JSON trước khi so sánh, vì vậy khoảng trắng, thụt lề và ngắt dòng không tạo ra khác biệt. Công cụ chỉ so sánh dữ liệu thực tế.
Công cụ có thể so sánh JSON chứa chú thích hoặc dấu phẩy ở cuối không? Không. JSON tiêu chuẩn, được định nghĩa trong RFC 8259, không cho phép chú thích hoặc dấu phẩy ở cuối. Đầu vào chứa các thành phần đó sẽ bị từ chối vì không hợp lệ.
Tài liệu tham khảo
- IETF. "Định dạng trao đổi dữ liệu JavaScript Object Notation (JSON)." RFC 8259, tháng mười hai 2017.
- IETF. "Bản vá JavaScript Object Notation (JSON)." RFC 6902, tháng tư 2013.
- IETF. "JSONPath: Các biểu thức truy vấn cho JSON." RFC 9535, tháng hai 2024. (Mục 2,2 định nghĩa mã định danh gốc
$.) - Mạng lưới Nhà phát triển Mozilla. "JSON.parse()."