>_toolkitbox

~/tools / LLM JSON Repair

LLM JSON Repair — Sửa JSON bị lỗi do mô hình AI trả về

Sửa thứ «gần giống JSON» mà mô hình AI trả về: bỏ code fence và lời dẫn, xóa dấu phẩy thừa và chú thích, sửa dấu nháy, khóa và giá trị kiểu Python, rồi liệt kê chính xác những gì đã đổi. Không có gì rời khỏi trình duyệt của bạn.

Thụt lề

Chỉ áp dụng những cách sửa có đúng một đáp án rõ ràng. Mọi trường hợp khác được báo kèm vị trí thay vì bị đoán.

Mọi thứ chạy trong trình duyệt của bạn. Văn bản bạn dán không được tải lên.

Mô hình ngôn ngữ thường bọc JSON trong một code fence và một câu giải thích, rồi làm hỏng cú pháp: dấu phẩy thừa ở cuối, dấu nháy đơn, chú thích, True thay vì true. JSON.parse từ chối tất cả những thứ này. Công cụ này tìm JSON trong văn bản và chỉ sửa những lỗi có đúng một cách sửa rõ ràng, rồi liệt kê mọi thay đổi để bạn tự đánh giá. Nếu đầu ra bị cắt giữa chừng, công cụ đóng những phần còn mở và cảnh báo rằng dữ liệu có thể bị thiếu. Công cụ không đoán: đầu vào không sửa được sẽ được báo kèm vị trí thay vì bị âm thầm thay đổi.

Trường hợp dùng

  • Sửa câu trả lời của mô hình trước khi đưa vào JSON.parse hoặc tệp cấu hình
  • Làm sạch câu trả lời có code fence và phần giải thích bao quanh JSON
  • Kiểm tra những gì đã thay đổi, để một giá trị đã sửa không lọt vào môi trường production mà không ai biết

Cách dùng

  1. Dán câu trả lời của mô hình, hoặc tải ví dụ.
  2. Đọc JSON đã sửa và danh sách thay đổi bên dưới.
  3. Sao chép kết quả. Các thay đổi đánh dấu màu hổ phách có thể làm mất thông tin, hãy kiểm tra chúng.

Thế nào là JSON hợp lệ

  • Chuỗi và tên thành viên chỉ dùng dấu nháy kép. Dấu nháy đơn không thuộc ngữ pháp.
  • Không có chú thích. Thứ duy nhất được phép chèn vào là khoảng trắng.
  • Dấu phẩy chỉ đặt giữa các thành viên hoặc phần tử, nên dấu phẩy thừa ở cuối là không được phép.
  • Một giá trị là đối tượng, mảng, số hoặc chuỗi, hoặc một trong false, null và true. Infinity, NaN và undefined không phải là giá trị JSON.
  • Số không được có số 0 đứng đầu hay dấu + đứng đầu, và dấu thập phân cần có chữ số ở cả hai phía, nên 012, +5, .5 và 5. đều không hợp lệ.
  • Ký tự điều khiển từ U+0000 đến U+001F trong chuỗi phải được escape, nên một ký tự xuống dòng thô trong chuỗi là không hợp lệ.
  • Cấp cao nhất có thể là bất kỳ giá trị nào, không chỉ đối tượng hay mảng.

Đầu ra của mô hình thường hỏng ở đâu

Vấn đềVí dụCông cụ này làm gì
Code fence và lời dẫnSure! ```json { … } ``` Hope this helpsChỉ lấy phần JSON
Dấu phẩy thừa[1, 2,]Xóa dấu phẩy
Chú thích{"a": 1 // note}Xóa chú thích
Dấu nháy đơn{'a': 'b'}Dùng dấu nháy kép
Khóa trần{a: 1}Thêm dấu nháy quanh khóa
Giá trị kiểu Python{"ok": True, "x": None}Ghi true và null
Xuống dòng thô trong chuỗi"line one⏎line two"Escape thành \n
NaN hoặc undefined{"x": NaN}Ghi null và cảnh báo rằng giá trị đã mất
Câu trả lời bị cắt giữa chừng{"items": [{"id": 1}, {"id":Đóng những phần còn mở và cảnh báo rằng dữ liệu có thể bị thiếu

Sửa gì là an toàn, và gì thì không

Một cách sửa là an toàn khi văn bản hỏng chỉ có đúng một cách hiểu hợp lý. Dấu phẩy thừa, chú thích hay code fence có thể bị xóa mà không đổi điều dữ liệu nói. Các thay đổi khác làm đổi ý nghĩa, nên chúng được đánh dấu và bạn cần kiểm tra: đóng một câu trả lời bị cắt giữa chừng cho ra JSON hợp lệ nhưng thiếu dữ liệu, và đổi NaN thành null làm mất giá trị gốc.

Có hai giới hạn đến từ chính JSON. RFC 8259 nói rằng tên trong một đối tượng nên là duy nhất và rằng hành vi của phần mềm là không thể đoán trước khi chúng trùng nhau; công cụ này giữ cái cuối cùng, giống JSON.parse. RFC cũng nói rằng phần mềm tương tác tốt với nhau khi không mong đợi phạm vi hay độ chính xác vượt quá một số double IEEE 754. Công cụ này giữ nguyên các số như bạn viết, nhưng một chương trình đọc số nguyên rất dài thành double sẽ làm tròn nó. Số nguyên từ -(2^53)+1 đến (2^53)-1 là chính xác.

Tốt hơn: yêu cầu API trả về structured output

Sửa chỉ là phương án dự phòng. Các API của mô hình có thể ép đầu ra theo một schema, và ba nhà cung cấp mô tả việc này khác nhau.

  • OpenAI: Structured Outputs khiến mô hình tạo ra phản hồi tuân theo JSON Schema của bạn, còn JSON mode chỉ đảm bảo JSON hợp lệ. Một lời từ chối có thể không theo schema, và một phản hồi chạm giới hạn token tối đa là chưa hoàn chỉnh (trạng thái incomplete, lý do max_output_tokens).
  • Anthropic: structured outputs dùng constrained decoding để phản hồi theo schema của bạn, và tài liệu nói điều này đúng trong hầu hết trường hợp. Một lời từ chối (stop_reason refusal) hoặc câu trả lời bị cắt bởi max_tokens có thể không khớp schema, nên hãy kiểm tra stop_reason trước khi phân tích.
  • Google Gemini: mô hình được cấu hình để tạo ra JSON tuân theo schema bạn đưa. Tính đúng về ngữ nghĩa không được đảm bảo, nên hãy kiểm tra các giá trị, và một số ràng buộc như minLength và maxLength không được áp dụng.

Không nhà cung cấp nào trong ba nhà này hứa JSON hợp lệ khi đầu ra bị cắt giữa chừng. Hãy kiểm tra lý do mô hình dừng trước khi tin vào kết quả đã phân tích.

Nguồn (kiểm tra ngày 2026-10-23): RFC 8259: The JavaScript Object Notation (JSON) Data Interchange Format / OpenAI: Structured Outputs / Anthropic: Structured outputs / Google AI for Developers: Structured output

Hỏi đáp

Công cụ sửa những gì?

Công cụ bỏ code fence và phần văn bản quanh JSON; bỏ dấu phẩy thừa và chú thích // hoặc /* */; đổi dấu nháy đơn và dấu nháy cong thành dấu nháy kép; thêm dấu nháy cho khóa không có dấu nháy; đổi True, False và None thành true, false và null; thêm dấu phẩy còn thiếu giữa các dòng; escape các ký tự xuống dòng thô trong chuỗi; và viết lại các số như +5, .5 và 0x1F thành số JSON hợp lệ.

Công cụ không bao giờ thay đổi điều gì?

Giá trị. Chuỗi được giữ nguyên từng ký tự, và số giữ nguyên các chữ số, nên một ID dài như 12345678901234567890 không bị làm tròn. Với khóa trùng lặp, công cụ theo JSON.parse: khóa cuối cùng thắng.

Nếu câu trả lời bị cắt giữa chừng thì sao?

Công cụ đóng các chuỗi, mảng và đối tượng đang mở, và bỏ khóa chưa có giá trị. Việc đó làm văn bản hợp lệ nhưng không đầy đủ, nên kết quả được đánh dấu là có thể thiếu dữ liệu. Hãy yêu cầu mô hình viết tiếp, hoặc nâng giới hạn đầu ra của nó, thay vì tin vào một kết quả bị cắt.

Tại sao NaN hoặc undefined biến thành null?

JSON không có NaN, Infinity hay undefined. Công cụ ghi null vào chỗ đó và đánh dấu lại, vì giá trị gốc đã mất.

Tại sao công cụ từ chối một số đầu vào?

Khi không có một cách sửa hiển nhiên duy nhất, chẳng hạn dấu ba chấm (...) thay cho các phần tử bị lược bỏ, hoặc một từ trần ở chỗ đáng lẽ là giá trị, công cụ dừng lại và chỉ ra vị trí, thay vì đoán.

Văn bản có bị gửi lên máy chủ không?

Không. Việc sửa chạy ngay trong trình duyệt của bạn.

Liên quan