Định dạng & kiểm tra JSON

Dán JSON để định dạng, kiểm tra hoặc nén — hoàn toàn trong trình duyệt của bạn. Số lớn giữ nguyên từng chữ số, khóa trùng được cảnh báo, và dữ liệu không bao giờ rời khỏi máy.

File không bao giờ rời khỏi thiết bị của bạn
0

Công cụ này làm gì

Dán JSON vào, thả một file, hoặc gõ trực tiếp, rồi định dạng, kiểm tra hoặc nén nó — hoàn toàn ngay trong trình duyệt của bạn. Một module WebAssembly được dựng từ Rust đảm nhận việc parse và viết lại ngay bên trong tab trình duyệt, nên JSON của bạn không bao giờ được tải lên server: không có gì trong nội dung đó rời khỏi thiết bị của bạn ở bất kỳ thời điểm nào.

Mẹo: Chưa chắc đầu vào của mình có phải JSON hợp lệ không? Cứ nhấp Định dạng — nếu có lỗi cú pháp, công cụ nêu rõ dòng và cột nơi việc parse thất bại; còn nếu JSON hợp lệ, mọi cảnh báo về khóa trùng hay số vượt ngưỡng an toàn của JavaScript sẽ hiện ngay dưới kết quả.

Cách sử dụng

Dán JSON của bạn vào ô nhập liệu, hoặc nạp từ một file. Chọn độ rộng thụt lề (2 dấu cách, 4 dấu cách, hoặc tab), hoặc bật Nén (minify) để gom mọi thứ về một dòng duy nhất. Bật Sắp xếp khóa nếu bạn muốn khóa của mọi object được sắp theo thứ tự bảng chữ cái. Nhấp Định dạng, rồi xem kết quả: nếu parse thành công, bạn sẽ thấy JSON đã định dạng cùng mọi cảnh báo kèm theo; nếu JSON không hợp lệ, công cụ chỉ rõ dòng và cột nơi việc parse bị lỗi. Sao chép kết quả hoặc tải về khi bạn đã hài lòng.

Vì sao số lớn không bị sai ở đây

Thử mở một số nguyên rất lớn như 12345678901234567890 bằng một công cụ JSON chạy trên trình duyệt thông thường, rồi xem kết quả trả về: 12345678901234568000. Vài chữ số cuối đã biến mất, thay bằng số 0, dù giao diện công cụ chẳng hề cảnh báo gì. Điều đó xảy ra vì phần lớn công cụ JSON parse bằng JavaScript, mà JavaScript lưu mọi con số — bất kể nó được viết ra sao — dưới dạng số thực dấu phẩy động 64-bit. Một số thực dạng này chỉ giữ được an toàn khoảng mười bảy chữ số có nghĩa, nên bất cứ số nào dài hơn sẽ bị âm thầm làm tròn về giá trị gần nhất mà kiểu số đó biểu diễn được, và khi ghi lại giá trị đã làm tròn đó, kết quả sẽ khác với con số bạn gõ vào ban đầu.

Công cụ định dạng này tránh hoàn toàn vấn đề đó bằng cách parse với thư viện serde_json của Rust ở chế độ giữ độ chính xác tuyệt đối, giữ nguyên phần chữ số gốc của từng con số thay vì chuyển nó sang số thực trước. Một số nguyên khổng lồ như ví dụ trên, hay một số thập phân dài hai mươi chữ số có nghĩa, khi ra khỏi công cụ này vẫn y hệt lúc vào — đúng từng byte, từng chữ số. Điều duy nhất công cụ này không kiểm soát được là ở bước sau: nếu bạn dán kết quả đã định dạng vào một công cụ khác cũng dùng số của JavaScript, công cụ đó vẫn sẽ làm tròn nó. Điều được đảm bảo ở đây chỉ là bản thân công cụ định dạng này không bao giờ gây ra sự sai lệch đó.

Khóa trùng: Giá trị cuối thắng, kèm cảnh báo

Về mặt cú pháp, JSON cho phép cùng một khóa xuất hiện nhiều hơn một lần trong cùng một object, dù phần lớn mọi người không cố tình viết JSON như vậy. Khi điều đó xảy ra, mọi trình phân tích JSON — kể cả JSON.parse có sẵn của trình duyệt — đều xử lý theo cùng một cách: giá trị được ghi sau cùng cho khóa đó sẽ thắng, còn mọi giá trị trước đó cho cùng khóa bị âm thầm loại bỏ. Công cụ này xử lý đúng theo quy tắc đó, nên kết quả của nó luôn khớp với bất kỳ trình phân tích JSON chuẩn nào khác.

Điều công cụ này bổ sung thêm là sự minh bạch. Trước khi định dạng, đầu vào được quét riêng để tìm khóa lặp lại, và nếu có, một cảnh báo sẽ nêu rõ tên khóa cùng đường dẫn chính xác tới object chứa nó — để bạn biết ngay có một giá trị đã bị loại bỏ, thay vì chỉ nhận ra sau này khi một trường mang giá trị không như bạn mong đợi.

Các tùy chọn định dạng

  • Thụt lề — chọn 2 dấu cách, 4 dấu cách, hoặc tab cho phần định dạng đẹp.
  • Nén (minify) — gom toàn bộ tài liệu về một dòng duy nhất, không còn khoảng trắng thừa, cho kết quả nhỏ nhất có thể.
  • Sắp xếp khóa — sắp lại khóa của mọi object theo thứ tự bảng chữ cái, đệ quy qua toàn bộ tài liệu, bất kể thứ tự ban đầu trong JSON của bạn.

Minify và Sắp xếp khóa hoạt động độc lập với nhau: chỉ bật Minify không bao giờ làm thay đổi thứ tự khóa, nó chỉ loại bỏ khoảng trắng. Khóa của bạn vẫn giữ đúng thứ tự đã viết trừ khi Sắp xếp khóa cũng được bật.

Giới hạn

Dữ liệu đầu vào bị giới hạn ở mức 10 MB. Một file hoặc đoạn dán vượt quá dung lượng đó bị từ chối ngay lập tức kèm thông báo rõ ràng, trước khi bất kỳ bước parse nào được thử, để bạn không phải chờ một tab trình duyệt âm thầm hết bộ nhớ.

Bước tiếp theo

Nếu bạn cần lấy ra những trường cụ thể trong một tài liệu JSON, biến đổi một mảng object, hoặc lọc bản ghi theo một điều kiện thay vì chỉ định dạng lại, công cụ jq chạy các filter kiểu jq thật trên JSON của bạn theo cùng cách hoàn toàn trong trình duyệt — nhưng cũng nên biết rằng cách jq xử lý số không giữ chính xác từng byte như công cụ định dạng này, nên với việc định dạng lại mà không muốn rủi ro với số lớn, trang này vẫn là lựa chọn phù hợp hơn.

Câu hỏi thường gặp

File hoặc đoạn JSON của tôi có bị tải lên đâu không?
Không. Việc định dạng, kiểm tra và nén đều diễn ra qua một module WebAssembly chạy ngay bên trong tab trình duyệt của bạn. JSON được parse và viết lại hoàn toàn trên thiết bị của bạn — không có gì được gửi tới server, và không có gì trong nội dung đó rời khỏi máy bạn.
Vì sao số lớn bị sai ở các công cụ JSON khác nhưng ở đây thì không?
Phần lớn công cụ JSON chạy trên trình duyệt dùng hàm JSON.parse có sẵn của JavaScript, mà JavaScript lại lưu mọi con số dưới dạng số thực dấu phẩy động 64-bit. Định dạng này chỉ giữ được khoảng mười bảy chữ số có nghĩa một cách an toàn, nên một số nguyên dài hoặc một số thập phân dài sẽ âm thầm mất đi phần đuôi ngay khi được parse. Công cụ này parse bằng Rust thay vì JavaScript, giữ nguyên phần chữ số gốc của từng con số, nên không có gì bị làm tròn mất.
Cảnh báo khóa trùng thực sự có nghĩa là gì?
Về mặt cú pháp, JSON cho phép cùng một khóa xuất hiện hai lần trong một object, và khi điều đó xảy ra, giá trị được ghi sau cùng sẽ thắng — giá trị trước đó bị âm thầm loại bỏ. Công cụ này xử lý theo đúng quy tắc đó nên kết quả định dạng luôn khớp với bất kỳ trình phân tích JSON chuẩn nào khác, nhưng nó còn quét đầu vào để tìm khóa trùng trước, rồi hiện cảnh báo nêu rõ tên khóa và vị trí xuất hiện, để bạn biết ngay có một giá trị đã bị loại bỏ thay vì phát hiện ra sau đó khi một trường mang giá trị không như mong đợi.
JSON tôi định dạng có giới hạn dung lượng không?
Có — tối đa 10 MB. Một file hoặc đoạn dán vượt quá dung lượng đó sẽ bị từ chối ngay lập tức kèm thông báo rõ ràng, trước khi bất kỳ bước parse nào bắt đầu, để bạn không phải chờ một tab trình duyệt âm thầm hết bộ nhớ giữa chừng.
Bật Nén (minify) có làm thay đổi thứ tự khóa không?
Không. Minify chỉ loại bỏ khoảng trắng và xuống dòng — mọi khóa vẫn giữ đúng thứ tự như trong JSON gốc của bạn. Chỉ có tùy chọn Sắp xếp khóa riêng biệt mới sắp lại khóa của mọi object theo thứ tự bảng chữ cái, đệ quy qua toàn bộ tài liệu, dù Minify có đang bật hay không.