Lỗi parse JSON thường gặp: nguyên nhân và cách sửa
Phần lớn lỗi parse JSON đến từ một danh sách ngắn các lỗi: dấu phẩy thừa ở cuối, chuỗi đặt trong nháy đơn, chú thích, khóa không có nháy, giá trị như NaN hay undefined, hoặc dấu nháy cong được sao chép từ tài liệu. JSON nghiêm ngặt hơn JavaScript mà nó giống, nên đoạn mã trông ổn với mắt người vẫn có thể bị parser từ chối. Thông báo lỗi chỉ ra một dòng và một cột, và cách sửa thường nằm ngay tại vị trí đó hoặc ngay trước nó.
Định dạng JSONJSON không đọc đượcDùng miễn phíCác quy tắc JSON bắt buộc
Một tài liệu JSON là một giá trị duy nhất: một object trong dấu ngoặc nhọn, một mảng trong dấu ngoặc vuông, một chuỗi, một số, true, false hoặc null. Bên trong các giá trị đó:
- Mọi khóa và mọi chuỗi đều dùng nháy kép thẳng, ví dụ "name".
- Dấu phẩy ngăn cách các phần tử, và không được có dấu phẩy sau phần tử cuối trong object hay mảng.
- Số không được có dấu cộng đứng đầu, và NaN, Infinity và undefined không phải là số hay giá trị hợp lệ.
- Hoàn toàn không cho phép chú thích.
- Khóa phải là chuỗi, nên khóa không có nháy như name: là không hợp lệ.
Một số parser chấp nhận vài lỗi trong số này theo mặc định, và một số công cụ chấp nhận JSON có chú thích như một tiện ích. Sự dễ dãi đó che giấu vấn đề cho đến khi file đến tay một trình đọc nghiêm ngặt hơn, nên hãy viết theo dạng nghiêm ngặt.
Đọc thông báo lỗi
Parser báo cáo vị trí đầu tiên mà nó không thể tiếp tục. Thông báo nêu vấn đề và cho biết vị trí, thường là dòng và cột. Dưới đây là một file nhỏ có dấu phẩy thừa trong mảng và một dấu phẩy khác sau thuộc tính cuối:
{
"name": "Ada",
"tags": ["a", "b",],
}
Python báo: "Illegal trailing comma before end of array: line 3 column 20". Cách diễn đạt khác nhau giữa các công cụ, và một số parser cũ chỉ nói "Unexpected token" kèm vị trí ký tự. Hãy đến vị trí được báo, rồi nhìn ký tự ngay trước nó. Lỗi thật thường là một dấu phẩy, dấu nháy hoặc dấu ngoặc nằm sớm hơn vị trí được báo một hai ký tự.
Một số thông báo khác từ parser của Python và ý nghĩa thường gặp:
- "Expecting property name enclosed in double quotes" với '{'a': 1}' nghĩa là có khóa đặt trong nháy đơn hoặc không có nháy.
- "Expecting value" ở vị trí bạn mong đợi một số hoặc chuỗi thường là do dấu nháy cong, vì parser coi nó là ký tự không xác định.
- "Expecting ',' delimiter" thường là thiếu dấu phẩy giữa hai phần tử, hoặc có chú thích nằm giữa dữ liệu.
Dấu nháy cong và văn bản sao chép
Dấu nháy cong là trường hợp gây nhầm lẫn nhất, vì trông gần giống hệt nháy thẳng. Một file JSON được sao chép từ trình soạn thảo văn bản, trang web hay tin nhắn chat có thể chứa dấu nháy kép cong. File trông đúng với bạn nhưng vẫn không parse được, vì parser thấy “x” là một ký tự lạ chứ không phải dấu bao quanh chuỗi.
Ký tự ẩn gây ra kiểu lỗi tương tự. Khoảng trắng không ngắt dòng giữa hai giá trị không phải là khoảng trắng đối với parser. Xóa ký tự ẩn trước khi bạn sửa cấu trúc bằng tay, rồi sau đó sửa các dấu nháy. Hướng dẫn về dấu nháy cong giải thích cách chuyển chúng về dạng thẳng một cách an toàn.
Nháy đơn, chú thích và khóa không có nháy
Nhiều lập trình viên viết dữ liệu giống JSON trong một ngôn ngữ cho phép nhiều hơn:
- Nháy đơn hợp lệ trong literal của JavaScript và Python, nhưng JSON yêu cầu nháy kép. Thay {'a': 1} bằng {"a": 1}.
- Chú thích như
//hoặc/* */phải được xóa. Nếu bạn cần ghi chú, hãy đặt chúng vào một trường riêng, hoặc dùng một định dạng được thiết kế cho file cấu hình. - Khóa không có nháy thường gặp trong object literal của JavaScript. Hãy thêm nháy cho chúng.
- NaN và undefined không thuộc JSON. Dùng null cho giá trị bị thiếu, hoặc dùng chuỗi nếu giá trị là văn bản.
Hãy cẩn thận khi tìm và thay thế hàng loạt. Đổi mọi nháy đơn thành nháy kép sẽ làm hỏng bất kỳ chuỗi nào có dấu nháy đơn, chẳng hạn như "Ada's notes". Hãy xem trước từng kết quả khớp trong tìm và thay thế văn bản để biết những nháy nào sẽ bị đổi.
Sửa cấu trúc từng bước
- Dán file vào công cụ định dạng JSON. Việc định dạng giúp thấy rõ cấu trúc, và lỗi hiển thị dòng và cột của nó. Sau đó nhấn Repair, thao tác này xóa chú thích và dấu phẩy thừa. Nó không thay đổi nháy đơn hay nháy cong, nên bạn hãy tự sửa những chỗ đó.
- Chỉ sửa lỗi đầu tiên, rồi kiểm tra lại. Một lỗi có thể sinh ra nhiều lỗi khác phía dưới.
- Kiểm tra mỗi dấu ngoặc nhọn hoặc ngoặc vuông mở đều có dấu đóng tương ứng, và cấu trúc lồng nhau đúng như bạn định.
- Kiểm tra file cuối cùng bằng parser mà ứng dụng của bạn dùng, không chỉ bằng một công cụ web. Các parser khác nhau một chút.
Một file parse được chưa chắc là file bạn định làm. Kiểm tra file theo JSON Schema để phát hiện trường bị thiếu hoặc giá trị sai kiểu, hoặc so sánh hai tài liệu JSON để xem điều gì đã thay đổi giữa các phiên bản.
Các trường hợp đặc biệt
- Dấu phẩy thừa trong file được tạo tự động. Một số công cụ vẫn ghi chúng. Nếu bạn tự dựng chuỗi JSON bằng tay, hãy dùng bộ serializer của ngôn ngữ bạn dùng, nó sẽ ghi ra kết quả hợp lệ.
- Khóa trùng lặp. JSON cho phép chúng, nhưng hầu hết parser chỉ giữ giá trị cuối cùng. Khóa trùng lặp là một lỗi chờ phát sinh.
- Số lớn. Số nguyên rất lớn có thể mất độ chính xác ở một số parser, nên hãy lưu các định danh dài hơn mức parser biểu diễn chính xác dưới dạng chuỗi. Hướng dẫn chuyển CSV sang JSON cũng nêu điểm này với ID.
Trả lời nhanh
Vì sao JSON của tôi lỗi dù trông đúng?
Các nguyên nhân thường gặp là dấu phẩy thừa, nháy đơn, chú thích, hoặc dấu nháy cong được sao chép từ tài liệu. Hãy kiểm tra vị trí trong thông báo lỗi và ký tự ngay trước nó.
JSON có thể có chú thích không?
Không. Chuẩn JSON không cho phép chú thích. Hãy xóa chúng, hoặc chuyển ghi chú vào một trường riêng. Nút Repair của công cụ định dạng sẽ xóa chúng giúp bạn.
Nên dùng gì thay cho undefined trong JSON?
Dùng null khi một giá trị cố ý bị thiếu, hoặc bỏ hẳn khóa đó đi. undefined là giá trị của JavaScript và không có biểu diễn trong JSON.
Được dịch từ Bản tiếng Anh với sự hỗ trợ của AI.
Bình luận
Chưa có bình luận nào. Hãy là người đầu tiên.


