So sánh hai JSON theo đường dẫn khóa: đọc kết quả và tránh những cái bẫy với mảng
Công cụ phân tích hai đoạn JSON rồi đối chiếu theo từng khóa chứ không theo từng dòng, nên thứ tự khóa và cách thụt lề hoàn toàn không ảnh hưởng. Kết quả liệt kê từng khác biệt kèm đường dẫn đầy đủ tới khóa đó và một trong ba nhãn: thêm mới, bị bỏ, hoặc đổi giá trị.
Tính năng nổi bật
- Hai ô nhập cho bản gốc và bản đã sửa, kèm sẵn ví dụ mẫu để bạn thử ngay
- So sánh theo cấu trúc khóa nên đảo thứ tự khóa hay đổi cách thụt lề đều không tạo khác biệt giả
- Đi sâu vào mọi cấp lồng nhau, không giới hạn độ sâu
- Mỗi khác biệt hiện đường dẫn đầy đủ tới khóa, các cấp nối với nhau bằng dấu chấm
- Ba nhãn phân biệt bằng màu: thêm mới màu xanh, bị bỏ màu đỏ, đổi giá trị màu vàng
- Với khóa đổi giá trị, hiện cả giá trị cũ gạch ngang và giá trị mới
- Đếm tổng số khác biệt ngay trên tiêu đề khối kết quả
- Nút chép trả về danh sách khác biệt dưới dạng JSON, tiện dán vào phiếu công việc hoặc đưa vào kịch bản xử lý
So JSON bằng công cụ so văn bản là cách chắc chắn mất thời gian
Hai phản hồi cùng nội dung nhưng khác thứ tự khóa sẽ hiện ra như hai tài liệu khác nhau hoàn toàn nếu bạn dùng công cụ so theo dòng, vì thứ tự khóa trong JSON không mang ý nghĩa mà công cụ so dòng lại coi trọng nó. Tình huống này xảy ra liên tục khi bạn so phản hồi của cùng một điểm cuối lấy ở hai thời điểm, hoặc so kết quả giữa môi trường thử và môi trường thật, vì nhiều thư viện không bảo đảm thứ tự khóa khi tuần tự hóa dữ liệu. Thêm nữa, một bên có thể được in đẹp còn bên kia nén thành một dòng, lúc đó công cụ so dòng chỉ báo cho bạn đúng một điều là toàn bộ đều khác. Công cụ này phân tích cả hai đoạn thành cấu trúc dữ liệu rồi mới so, nên nó chỉ nói về những thứ thật sự có ý nghĩa: khóa nào mới xuất hiện, khóa nào biến mất, và giá trị nào đã đổi.
Lợi ích khi sử dụng
- Không bị nhiễu bởi thứ tự khóa và cách định dạng
- Chỉ ra đúng đường dẫn tới khóa có vấn đề, khỏi phải dò tay
- Đi sâu được vào cấu trúc lồng nhiều tầng của phản hồi thật
- Kết quả chép ra ở dạng JSON nên máy đọc được, không chỉ để người xem
- Dữ liệu không rời khỏi trình duyệt nên dùng được với phản hồi chứa thông tin nội bộ
Cách so sánh hai đoạn JSON
- 1Dán bản gốc vào ô bên trái, chẳng hạn phản hồi của điểm cuối trước khi triển khai bản mới.
- 2Dán bản cần đối chiếu vào ô bên phải, hai bên không cần cùng cách thụt lề hay cùng thứ tự khóa.
- 3Bấm nút So sánh, nếu một trong hai đoạn sai cú pháp thì công cụ báo lỗi và không hiện kết quả nào.
- 4Đọc danh sách khác biệt, mỗi mục có nhãn màu và đường dẫn khóa để bạn biết chính xác chỗ cần xem.
- 5Bấm nút chép nếu cần đưa danh sách khác biệt vào phiếu công việc, tin nhắn báo lỗi hoặc một kịch bản xử lý tiếp.
Công cụ so theo khóa, và điều đó thay đổi cách bạn đọc kết quả
Thuật toán rất thẳng: gom toàn bộ khóa của cả hai bên thành một tập hợp, rồi xét từng khóa một. Khóa chỉ có ở bên phải được đánh dấu là thêm mới. Khóa chỉ có ở bên trái được đánh dấu là bị bỏ. Khóa có ở cả hai bên mà giá trị đều là đối tượng thì công cụ đi sâu vào bên trong và lặp lại đúng quy trình đó ở cấp dưới. Còn lại, nếu hai giá trị khác nhau thì đánh dấu là đổi giá trị và hiện cả hai. Với cặp ví dụ có sẵn trong ô nhập, kết quả cho ra đúng ba dòng: khóa tuổi đổi từ 30 sang 31, khóa thành phố bị bỏ, khóa quốc gia thêm mới; còn khóa tên không xuất hiện vì hai bên giống nhau. Hệ quả quan trọng là bạn sẽ không bao giờ thấy dòng nào nói về khoảng trắng, về dấu phẩy cuối hay về thứ tự khai báo, những thứ vốn chiếm phần lớn nhiễu khi so bằng công cụ văn bản. Đổi lại, công cụ không cho bạn thấy ngữ cảnh xung quanh, nên với khác biệt phức tạp bạn vẫn cần mở tệp gốc ra đọc.
Đọc đường dẫn khóa và một điểm cần lưu ý về chỉ số mảng
Mỗi khác biệt đi kèm một chuỗi mô tả vị trí, các cấp nối với nhau bằng dấu chấm, ví dụ một chuỗi gồm tên khóa ngoài, dấu chấm, rồi tên khóa trong. Điểm cần biết là chỉ số của phần tử mảng cũng được nối bằng dấu chấm chứ không đặt trong ngoặc vuông như cú pháp thường thấy khi truy cập dữ liệu. Nghĩa là phần tử đầu tiên của một mảng tên là danh sách sẽ hiện thành tên mảng, dấu chấm, số không, dấu chấm, rồi tên khóa bên trong. Khi bạn muốn dùng đường dẫn này để truy vào dữ liệu bằng mã, hãy nhớ đổi lại cho đúng cú pháp của ngôn ngữ mình dùng. Một lưu ý nhỏ nữa: nếu tên khóa trong JSON của bạn có chứa dấu chấm, chuyện hoàn toàn hợp lệ, thì đường dẫn hiện ra sẽ nhập nhằng vì không phân biệt được đâu là dấu ngăn cấp và đâu là dấu thuộc về tên khóa. Trường hợp đó hiếm nhưng có thật, thường gặp ở tệp cấu hình dùng tên khóa theo kiểu phân cấp phẳng.
Mảng được so theo vị trí, đây là cái bẫy lớn nhất
Trong JSON, mảng cũng là một dạng đối tượng có khóa là các chỉ số 0, 1, 2 và cứ thế. Vì vậy khi so hai mảng, công cụ ghép phần tử thứ nhất với phần tử thứ nhất, phần tử thứ hai với phần tử thứ hai, chứ không tìm xem phần tử nào tương ứng với phần tử nào. Hệ quả rất dễ gây hoang mang: chỉ cần bạn chèn thêm một phần tử vào đầu mảng, mọi phần tử phía sau bị đẩy lùi một bậc và toàn bộ chúng sẽ hiện ra như đã đổi giá trị, dù nội dung không hề thay đổi. Với một mảng ba mươi bản ghi, bạn nhận về hàng trăm dòng khác biệt cho một thao tác thêm duy nhất. Dấu hiệu nhận ra: số khác biệt lớn bất thường và tất cả đều tập trung trong cùng một mảng, kèm theo một mục thêm mới ở chỉ số cuối cùng. Cách xử lý là sắp xếp lại cả hai mảng theo một khóa định danh ổn định trước khi dán vào, ví dụ theo mã bản ghi; hoặc nếu chỉ quan tâm một phần tử, hãy tách riêng phần tử đó ở cả hai bên rồi so.
So sánh chặt về kiểu dữ liệu, không chỉ về nội dung hiển thị
Hai giá trị được coi là khác nhau khi chúng khác nhau cả về kiểu lẫn về nội dung. Điều này bắt được đúng loại lỗi hay gặp nhất khi đổi phiên bản của một dịch vụ: số 30 và chuỗi ba mươi trong dấu nháy là hai thứ khác nhau, và công cụ sẽ báo, dù trên màn hình chúng trông gần như nhau, chỉ khác cặp dấu nháy. Tương tự, giá trị đúng dạng luận lý khác với chuỗi chứa chữ đúng, và giá trị rỗng dạng null khác với chuỗi rỗng. Đây chính là nhóm lỗi làm sập phần xử lý ở phía trình duyệt sau khi nhóm phía máy chủ đổi kiểu một trường mà không báo ai. Ngược lại, có những khác biệt về hình thức không bị tính là khác nhau, vì bước phân tích đã chuẩn hóa chúng: số ghi 1.0 và số ghi 1 sau khi phân tích đều thành cùng một giá trị, số ghi theo ký hiệu khoa học cũng vậy, và chuỗi có ký tự thoát khác nhau nhưng cho cùng nội dung cũng được coi là giống. Đó là điểm mạnh so với việc so bằng văn bản thuần.
Bốn việc thực tế và cách lọc bớt nhiễu trước khi so
Việc thứ nhất là đối chiếu phản hồi của cùng một điểm cuối giữa môi trường thử và môi trường thật để tìm ra chỗ cấu hình lệch. Việc thứ hai là kiểm tra thay đổi sau khi nâng phiên bản một dịch vụ bên ngoài, xem trường nào bị đổi tên hoặc đổi kiểu. Việc thứ ba là so hai tệp ngôn ngữ của website đa ngôn ngữ để tìm khóa dịch bị thiếu; nhãn bị bỏ và nhãn thêm mới cho bạn danh sách chính xác cần bổ sung. Việc thứ tư là so hai tệp cấu hình giữa máy chủ chạy tốt và máy chủ đang lỗi. Trong cả bốn trường hợp, có một bước chuẩn bị đáng làm: xóa bớt các trường luôn khác nhau theo bản chất trước khi dán vào, chẳng hạn dấu thời gian, mã phiên, mã yêu cầu, thời lượng xử lý, mã thẻ bộ nhớ đệm. Công cụ không có tùy chọn bỏ qua khóa, nên nếu để nguyên thì danh sách kết quả sẽ đầy những dòng vô nghĩa che mất khác biệt thật. Với phản hồi lớn, cũng nên cắt lấy đúng nhánh dữ liệu bạn quan tâm thay vì dán cả phản hồi vài nghìn dòng.
Câu hỏi thường gặp (FAQ)
Đảo thứ tự các khóa thì có bị báo khác biệt không?
Không. Công cụ phân tích cả hai đoạn thành cấu trúc dữ liệu rồi mới so theo từng khóa, nên thứ tự khai báo hoàn toàn không ảnh hưởng. Cách thụt lề, việc xuống dòng hay việc một bên bị nén thành một dòng cũng không tạo ra khác biệt giả.
Vì sao thêm một phần tử vào đầu mảng lại ra hàng loạt khác biệt?
Vì mảng được so theo chỉ số vị trí chứ không theo nội dung phần tử. Chèn một phần tử ở đầu làm mọi phần tử phía sau lùi một bậc, nên tất cả đều bị coi là đổi giá trị. Hãy sắp xếp cả hai mảng theo một khóa định danh ổn định trước khi dán vào để tránh tình trạng này.
Số 30 và chuỗi 30 trong dấu nháy có bị coi là khác nhau không?
Có, và đây là điểm mạnh của công cụ. Phép so sánh xét cả kiểu dữ liệu lẫn nội dung, nên số nguyên khác với chuỗi ký tự, giá trị luận lý khác với chuỗi chứa cùng chữ đó, và giá trị null khác với chuỗi rỗng. Đây đúng là nhóm lỗi hay gặp khi một dịch vụ đổi kiểu trường mà không báo.
Đường dẫn tới phần tử trong mảng viết thế nào?
Chỉ số mảng cũng được nối bằng dấu chấm chứ không đặt trong ngoặc vuông, ví dụ tên mảng rồi dấu chấm rồi số không rồi dấu chấm rồi tên khóa bên trong. Khi dùng đường dẫn này để truy vào dữ liệu bằng mã, bạn cần đổi lại cho đúng cú pháp của ngôn ngữ mình dùng.
Báo JSON không hợp lệ nhưng không nói sai chỗ nào?
Đúng, thông báo ở đây chỉ có một câu chung. Hãy đưa từng đoạn qua một công cụ định dạng JSON để nó chỉ ra vị trí lỗi. Ba nguyên nhân hay gặp nhất là dấu phẩy thừa sau phần tử cuối, dùng dấu nháy đơn thay vì nháy kép, và chú thích lẫn trong nội dung vì JSON không cho phép chú thích.
Có bỏ qua được một số khóa như dấu thời gian không?
Không có tùy chọn bỏ qua khóa. Với các trường luôn khác nhau theo bản chất như dấu thời gian, mã phiên hay mã yêu cầu, hãy xóa chúng khỏi cả hai đoạn trước khi dán vào, nếu không danh sách kết quả sẽ đầy dòng vô nghĩa che mất khác biệt thật.
So được hai mảng ở cấp ngoài cùng không?
Được, vì mảng cũng có khóa là các chỉ số nên công cụ xử lý bình thường. Nhưng vẫn dính đúng cái bẫy so theo vị trí, nên với hai danh sách bản ghi, hãy chắc rằng cả hai đã được sắp xếp theo cùng một khóa định danh trước khi so.
Nếu dán vào một giá trị đơn như một con số thì sao?
Cú pháp vẫn hợp lệ nên không báo lỗi, nhưng giá trị đơn không có khóa nào để so nên kết quả sẽ là không tìm thấy khác biệt, kể cả khi hai con số khác nhau. Công cụ được thiết kế cho đối tượng và mảng, hãy bọc giá trị đơn vào một đối tượng nếu cần so.
Nút chép trả về cái gì?
Một mảng JSON, mỗi phần tử là một khác biệt với các trường đường dẫn, loại thay đổi, giá trị cũ và giá trị mới tùy theo loại. Vì là JSON nên bạn dán được vào phiếu công việc cho người khác đọc, hoặc đưa thẳng vào một kịch bản để xử lý tự động.
Công cụ có so được tệp JSON tải lên không?
Không, chỉ nhận nội dung dán trực tiếp vào hai ô. Với tệp trên máy, hãy mở bằng trình soạn thảo rồi chép sang. Với phản hồi từ một dịch vụ, hãy lấy từ tab mạng trong công cụ dành cho nhà phát triển bằng chức năng sao chép phản hồi.
Dữ liệu tôi dán vào có được gửi đi đâu không?
Không. Cả hai bước phân tích cú pháp và so sánh đều chạy bằng JavaScript ngay trên trình duyệt, không có lời gọi mạng nào. Đóng tab là nội dung biến mất, nên bạn dùng được với phản hồi chứa dữ liệu nội bộ, miễn là bạn tự che các trường nhạy cảm nếu định chia sẻ kết quả.
So được JSON lớn cỡ nào?
Không có giới hạn cứng, nhưng vì kết quả được dựng thành từng khối hiển thị nên khi số khác biệt lên tới hàng nghìn, trang sẽ chậm rõ rệt. Với phản hồi lớn, hãy cắt lấy đúng nhánh dữ liệu bạn quan tâm ở cả hai bên rồi mới so, vừa nhanh vừa dễ đọc kết quả.
Từ khóa liên quan
- so sánh hai file json
- json diff online
- tìm khác biệt giữa hai json
- so sánh phản hồi api
- so sánh json theo khóa
- đường dẫn khóa json
- so sánh file cấu hình json
- so sánh file dịch i18n
- thiếu khóa dịch trong json
- json không hợp lệ lỗi dấu phẩy
- so sánh mảng json
- kiểu dữ liệu trong json
- chuỗi và số trong json khác nhau
- kiểm tra thay đổi sau khi nâng phiên bản api
- môi trường thử và môi trường thật khác nhau
- công cụ so sánh json miễn phí
- json compare online
- xuất danh sách khác biệt json
- định dạng json là gì
- so sánh dữ liệu có cấu trúc
