So sánh hai chuỗi JSON theo cấu trúc: đọc đường dẫn khóa và những bẫy hay gặp
Công cụ phân tích cú pháp hai chuỗi JSON rồi đối chiếu theo cấu trúc khóa và giá trị chứ không đối chiếu theo dòng, nên thứ tự khóa, thụt đầu dòng hay cách xuống dòng không ảnh hưởng kết quả. Mỗi khác biệt được liệt kê kèm đường dẫn đầy đủ tới vị trí và phân loại thành thêm khóa, mất khóa hoặc đổi giá trị.
Tính năng nổi bật
- Phân tích cú pháp cả hai chuỗi trước khi so, báo lỗi ngay nếu có bên nào sai cú pháp JSON
- So sánh đệ quy xuống mọi tầng lồng nhau của đối tượng và mảng
- Phân loại ba dạng khác biệt: khóa chỉ có ở bản mới, khóa chỉ có ở bản cũ, và khóa tồn tại ở cả hai nhưng giá trị khác
- Mỗi khác biệt kèm đường dẫn khóa viết theo dấu chấm, ví dụ user.address.city hay items.0.price
- Hiển thị giá trị cũ và giá trị mới cạnh nhau cho những khóa bị đổi giá trị
- Đếm tổng số khác biệt, và báo rõ khi hai chuỗi hoàn toàn trùng khớp
- Ba màu viền phân biệt ba dạng khác biệt để quét mắt nhanh trong danh sách dài
- Nút sao chép xuất danh sách khác biệt ra dạng văn bản có dấu cộng, dấu trừ và dấu ngã
- Nút nạp dữ liệu mẫu để thử ngay mà không cần tự soạn JSON
- Chạy hoàn toàn trên trình duyệt, chuỗi JSON bạn dán vào không được gửi lên máy chủ
So theo cấu trúc khác so theo dòng ở chỗ nào
Nếu bạn dán hai tệp JSON vào một công cụ so sánh văn bản thông thường, bạn sẽ nhận về hàng loạt khác biệt giả. Một bên xuất ra bằng hai dấu cách thụt đầu dòng, bên kia bằng bốn; một bên đưa khóa id lên đầu, bên kia đưa xuống cuối; một bên xuống dòng sau mỗi phần tử, bên kia gộp cả mảng vào một dòng. Về mặt dữ liệu thì hai tệp giống hệt nhau, nhưng về mặt văn bản thì khác gần như toàn bộ. Chuẩn JSON không quy định thứ tự khóa trong một đối tượng, nên hai hệ thống sinh cùng một dữ liệu vẫn có thể sắp khóa khác nhau. Công cụ này phân tích cú pháp trước rồi mới so, nên toàn bộ lớp khác biệt về hình thức bị loại bỏ và những gì hiện ra đều là khác biệt thật về dữ liệu. Đổi lại, nó đòi hỏi cả hai bên phải là JSON hợp lệ và nó không cho bạn thấy bố cục tệp gốc.
Lợi ích khi sử dụng
- Không còn khác biệt giả do thứ tự khóa và cách định dạng khác nhau
- Đường dẫn khóa chỉ thẳng tới vị trí cần sửa thay vì chỉ số dòng
- Phân loại rõ ba dạng nên biết ngay là mất trường, thừa trường hay sai giá trị
- Kiểm tra được cú pháp JSON luôn trong cùng một thao tác
- Dữ liệu nhạy cảm trong phản hồi API không rời khỏi trình duyệt
Cách so sánh hai chuỗi JSON
- 1Dán chuỗi JSON gốc vào ô bên trái và chuỗi cần đối chiếu vào ô bên phải, hoặc bấm nạp dữ liệu mẫu để xem trước cách công cụ trình bày kết quả.
- 2Bấm nút So sánh, vì kết quả không tự chạy lại khi bạn gõ mà chỉ dựng lại sau mỗi lần bấm.
- 3Nếu hiện thông báo JSON không hợp lệ, hãy kiểm tra dấu phẩy thừa ở cuối, dấu nháy đơn thay vì nháy kép và phần chú thích lẫn trong tệp.
- 4Đọc dòng tiêu đề để biết hai bên trùng khớp hay có bao nhiêu khác biệt, rồi quét danh sách theo màu viền của từng dạng.
- 5Dùng đường dẫn khóa trong từng dòng kết quả để mở đúng vị trí trong tệp gốc, và bấm sao chép nếu cần gửi danh sách khác biệt cho người khác.
Đường dẫn khóa trong kết quả nên đọc thế nào
Mỗi dòng kết quả bắt đầu bằng đường dẫn từ gốc xuống tới chỗ khác biệt, các tầng nối với nhau bằng dấu chấm. Đường dẫn user.address.city nghĩa là đi vào khóa user, rồi khóa address, rồi tới khóa city. Với mảng, chỉ số phần tử cũng là một tầng: items.0.price là giá của phần tử đầu tiên trong mảng items, và chỉ số đếm từ 0 chứ không phải từ 1. Khi cả hai chuỗi là giá trị đơn lẻ chứ không phải đối tượng, ví dụ hai con số hoặc hai chuỗi ký tự, đường dẫn hiện là root. Có một trường hợp gây nhầm mà bạn nên biết: nếu chính tên khóa có chứa dấu chấm, chẳng hạn khóa vi.homepage.title trong tệp ngôn ngữ dạng phẳng, thì đường dẫn hiện ra trông hệt như ba tầng lồng nhau. Lúc đó hãy dựa vào tệp gốc để biết đâu là cấu trúc thật. Khi cần tra cứu bằng lệnh sau này, ký hiệu dấu chấm này gần giống cách viết đường dẫn trong công cụ xử lý JSON trên dòng lệnh nên chuyển đổi khá dễ.
Mảng được so theo vị trí, không theo nội dung
Đây là điểm dễ hiểu nhầm nhất. Công cụ coi mảng như một đối tượng có khóa là chỉ số, nên nó ghép phần tử thứ nhất với phần tử thứ nhất, thứ hai với thứ hai. Cách này đúng khi thứ tự có ý nghĩa, ví dụ các bước trong quy trình hay danh sách đã sắp xếp. Nhưng khi thứ tự không mang ý nghĩa, chẳng hạn một danh sách người dùng mà máy chủ trả về theo thứ tự khác nhau giữa hai lần gọi, kết quả sẽ là một chuỗi khác biệt dài dằng dặc dù dữ liệu y hệt. Dấu hiệu nhận ra rất rõ: gần như mọi phần tử đều bị báo đổi giá trị, và giá trị cũ của phần tử này lại chính là giá trị mới của phần tử khác. Cách xử lý là sắp xếp cả hai mảng theo một khóa định danh trước khi dán vào, ví dụ sắp theo id. Một trường hợp khác cũng gây nhiễu là chèn thêm một phần tử vào giữa mảng: mọi phần tử phía sau bị đẩy lệch một vị trí và đều bị báo là đổi giá trị, cộng thêm một khác biệt ở phần tử cuối.
Những khác biệt bị mất ngay ở bước phân tích cú pháp
Vì công cụ so trên dữ liệu đã phân tích chứ không so trên văn bản gốc, có vài loại khác biệt sẽ không bao giờ xuất hiện. Thứ nhất là số nguyên quá lớn: JavaScript chỉ giữ chính xác số nguyên tới khoảng chín triệu tỷ, cụ thể là 9007199254740991, nên hai định danh dài mười chín chữ số chỉ khác nhau ở chữ số cuối vẫn có thể bị làm tròn về cùng một giá trị và bị báo là giống nhau. Với định danh dài, hãy để chúng ở dạng chuỗi ký tự trong JSON. Thứ hai là khóa trùng lặp trong cùng một đối tượng: chuẩn JSON không cấm, và khi phân tích thì giá trị sau đè giá trị trước, nên bản có khóa trùng và bản chỉ giữ khóa cuối sẽ được coi là như nhau. Thứ ba là cách viết số: 1e3 và 1000 hay 1.50 và 1.5 đều cho cùng một giá trị. Thứ tư là ký tự thoát Unicode: một chuỗi viết bằng mã thoát và một chuỗi viết trực tiếp ký tự tiếng Việt cho ra cùng nội dung sau khi phân tích.
Vài trường hợp biên nên biết trước khi tin kết quả
Bước kiểm tra đầu tiên của công cụ là so kiểu dữ liệu của hai bên. Trong JavaScript, mảng và giá trị rỗng đều mang kiểu đối tượng, nên có hai tình huống cho ra kết quả gây bất ngờ. Tình huống thứ nhất: một bên là mảng gồm ba phần tử, bên kia là đối tượng có ba khóa mang tên 0, 1 và 2 với đúng các giá trị đó. Công cụ sẽ báo hai bên giống nhau, dù về mặt dữ liệu đây là hai kiểu hoàn toàn khác nhau và hệ thống nhận vào sẽ xử lý khác nhau. Tình huống thứ hai liên quan tới giá trị rỗng: một khóa mang giá trị rỗng và cùng khóa đó mang một đối tượng sẽ được báo là đổi giá trị, đây là kết quả đúng như mong đợi. Ngoài ra cần phân biệt ba trạng thái mà nhiều người gộp làm một: khóa không tồn tại, khóa tồn tại với giá trị rỗng, và khóa tồn tại với chuỗi rỗng. Công cụ phân biệt rành mạch ba trạng thái này, và trong kiểm thử API thì đây thường chính là điểm gây lỗi.
Những việc thực tế mà so sánh JSON giải quyết gọn
Việc thường gặp nhất là đối chiếu phản hồi của cùng một điểm cuối API giữa môi trường thử nghiệm và môi trường chạy thật, để tìm ra trường nào bị thiếu hoặc bị đổi kiểu khiến giao diện vỡ. Việc thứ hai là kiểm tra tệp ngôn ngữ của website đa ngôn ngữ: dán bản tiếng Việt và bản tiếng Anh vào, mọi khóa hiện ở nhóm thêm hoặc mất chính là khóa chưa dịch hoặc khóa đã bị đổi tên một bên mà quên bên còn lại. Việc thứ ba là soi thay đổi trong tệp khai báo phụ thuộc hoặc tệp cấu hình biên dịch giữa hai nhánh, khi bạn muốn biết chính xác trường nào đổi mà không phải đọc cả tệp. Việc thứ tư là xác nhận một lần chuyển đổi dữ liệu không làm mất trường nào, bằng cách so một bản ghi mẫu trước và sau khi chuyển. Việc thứ năm là dựng kiểm thử hồi quy thủ công: lưu lại phản hồi của một lần chạy tốt, sau mỗi lần triển khai thì gọi lại và so với bản đã lưu, mọi khác biệt ngoài các trường thời gian đều đáng để xem lại.
Câu hỏi thường gặp (FAQ)
Thứ tự khóa khác nhau có bị báo là khác biệt không?
Không. Công cụ phân tích cú pháp rồi duyệt theo tên khóa nên thứ tự sắp xếp trong tệp không ảnh hưởng gì. Hai đối tượng có cùng tập khóa và cùng giá trị sẽ được báo là trùng khớp dù một bên đặt khóa id lên đầu còn bên kia đặt xuống cuối.
Mảng được so theo thứ tự hay theo nội dung?
Theo thứ tự. Phần tử thứ nhất ghép với phần tử thứ nhất, và cứ thế theo chỉ số. Nếu hai mảng chứa cùng dữ liệu nhưng sắp xếp khác nhau, kết quả sẽ đầy khác biệt giả. Hãy sắp xếp cả hai mảng theo một khóa định danh trước khi dán vào để tránh tình huống này.
Vì sao chèn một phần tử vào giữa mảng lại sinh ra rất nhiều khác biệt?
Vì mọi phần tử phía sau bị đẩy lệch một vị trí, mà công cụ ghép theo chỉ số nên nó so phần tử thứ nhất của bản cũ với phần tử thứ nhất của bản mới đã bị dời. Kết quả là một chuỗi báo đổi giá trị nối tiếp nhau cộng thêm một phần tử thừa ở cuối, dù thực tế chỉ có một phần tử được thêm.
Đường dẫn kiểu items.0.price nghĩa là gì?
Nghĩa là khóa price nằm trong phần tử đầu tiên của mảng items. Chỉ số phần tử đếm từ 0, nên items.0 là phần tử thứ nhất và items.3 là phần tử thứ tư. Khi hai chuỗi so sánh không phải đối tượng mà là giá trị đơn lẻ, đường dẫn hiện là root.
Vì sao báo JSON không hợp lệ trong khi tôi thấy tệp vẫn đúng?
Bốn nguyên nhân phổ biến nhất là dấu phẩy thừa sau phần tử cuối, dùng dấu nháy đơn thay cho nháy kép, có dòng chú thích lẫn trong tệp, và tên khóa không được đặt trong dấu nháy. Ba thứ đầu hợp lệ trong JavaScript nhưng không hợp lệ trong JSON, đây là chỗ nhầm rất hay gặp.
Công cụ có báo bên nào sai cú pháp không?
Không, thông báo lỗi chỉ nói chung là JSON không hợp lệ chứ không chỉ ra ô bên trái hay bên phải, cũng không nêu vị trí ký tự gây lỗi. Cách khoanh vùng nhanh là xóa tạm nội dung một ô rồi thử lại, hoặc dán từng bên vào một công cụ định dạng JSON để tìm chỗ hỏng.
Hai định danh dài khác nhau mà sao báo là giống nhau?
Vì số nguyên trong JavaScript chỉ chính xác tới 9007199254740991. Định danh dài hơn ngưỡng đó bị làm tròn ngay khi phân tích cú pháp, nên hai giá trị chỉ khác vài chữ số cuối có thể quy về cùng một số. Cách phòng là để định danh dài ở dạng chuỗi ký tự trong JSON.
Khóa không tồn tại và khóa có giá trị rỗng có được coi là như nhau không?
Không. Khóa vắng mặt ở một bên sẽ được xếp vào nhóm thêm hoặc mất khóa, còn khóa tồn tại ở cả hai bên nhưng một bên mang giá trị rỗng sẽ được xếp vào nhóm đổi giá trị. Đây là phân biệt quan trọng khi kiểm thử API, vì hai trường hợp này thường được xử lý khác nhau ở phía nhận.
So được chuỗi JSON lớn cỡ nào?
Không có giới hạn cứng, nhưng mọi thứ chạy trong trình duyệt nên vài trăm kilobyte vẫn nhanh, còn vài megabyte thì bắt đầu chậm và danh sách kết quả trở nên khó đọc. Với tệp lớn, nên cắt lấy phần cần soi hoặc dùng công cụ xử lý JSON trên dòng lệnh.
Kết quả sao chép ra có định dạng thế nào?
Mỗi khác biệt là một dòng: dấu cộng cho khóa chỉ có ở bản mới, dấu trừ cho khóa chỉ có ở bản cũ, dấu ngã cho khóa đổi giá trị kèm mũi tên chỉ từ giá trị cũ sang giá trị mới. Dạng này dán thẳng vào tin nhắn hay phiếu công việc đọc được ngay mà không cần chỉnh gì thêm.
Dữ liệu tôi dán vào có bị gửi đi đâu không?
Không. Việc phân tích cú pháp và so sánh chạy bằng JavaScript ngay trong trình duyệt, không có lời gọi mạng nào mang nội dung đi và không có lịch sử nào được lưu. Dù vậy, với phản hồi chứa dữ liệu cá nhân hay khóa truy cập, thói quen tốt vẫn là thay giá trị thật bằng giá trị giả trước khi so.
Khi nào nên dùng công cụ so sánh văn bản thay vì công cụ này?
Khi bạn cần biết chính tệp thay đổi thế nào chứ không phải dữ liệu thay đổi thế nào, ví dụ soi lại thứ tự khóa, cách thụt đầu dòng hay khóa trùng lặp trong tệp. Cũng nên dùng công cụ văn bản khi một trong hai bên chưa phải JSON hợp lệ, vì công cụ này bắt buộc phân tích cú pháp thành công mới so được.
Từ khóa liên quan
- so sánh json online
- json compare online
- json diff online
- công cụ so sánh 2 file json
- tìm khác biệt giữa hai json
- so sánh response api
- so sánh file ngôn ngữ i18n
- kiểm tra json hợp lệ
- đường dẫn khóa json
- so sánh mảng json theo thứ tự
- json key order không quan trọng
- lỗi dấu phẩy thừa trong json
- số nguyên lớn bị làm tròn trong json
- khóa trùng lặp trong json
- so sánh package json giữa hai nhánh
- kiểm tra dữ liệu sau khi migrate
- json comparator miễn phí
- so sánh cấu hình json
- kiểm thử hồi quy phản hồi api
- công cụ diff json không cần cài đặt
