>_toolkitbox

~/tools / LLM JSON Repair

LLM JSON Repair — AI 모델이 돌려준 깨진 JSON을 고칩니다

AI 모델이 돌려준 거의 JSON인 텍스트를 고칩니다. 코드 펜스와 군더더기 문장을 걷어내고, 후행 쉼표와 주석을 제거하며, 따옴표·키·Python 값을 바로잡고, 무엇을 바꿨는지 하나하나 알려 줍니다. 입력한 내용은 브라우저 밖으로 나가지 않습니다.

들여쓰기

답이 하나로 정해지는 수정만 적용합니다. 그 밖의 문제는 추측하지 않고 위치와 함께 알려 줍니다.

모든 처리는 브라우저 안에서 이루어집니다. 붙여넣은 텍스트는 업로드되지 않습니다.

언어 모델은 JSON을 코드 펜스와 한 문장으로 감싸서 내놓고, 문법도 자주 틀립니다. 후행 쉼표, 작은따옴표, 주석, true 대신 True 같은 것들입니다. JSON.parse는 이런 입력을 모두 거부합니다. 이 도구는 텍스트에서 JSON을 찾아내고, 고치는 방법이 하나로 정해지는 문제만 고친 뒤 모든 변경 내용을 목록으로 보여 주므로 직접 판단할 수 있습니다. 출력이 중간에 잘렸다면 열려 있는 부분을 닫아 주고, 데이터가 빠졌을 수 있다고 경고합니다. 추측하지 않습니다. 고칠 수 없는 입력은 몰래 바꾸지 않고 위치와 함께 알려 줍니다.

이럴 때 사용

  • 모델의 응답을 JSON.parse나 설정 파일에 넣기 전에 고치기
  • JSON 앞뒤에 코드 펜스와 설명이 붙은 응답을 정리하기
  • 무엇이 바뀌었는지 확인해서, 고쳐진 값이 모르는 사이에 운영 환경으로 들어가지 않게 하기

사용법

  1. 모델의 응답을 붙여넣거나 예시를 불러옵니다.
  2. 고쳐진 JSON과 그 아래의 변경 목록을 확인합니다.
  3. 결과를 복사합니다. 호박색으로 표시된 변경은 정보를 잃을 수 있으니 확인하세요.

유효한 JSON이란

  • 문자열과 멤버 이름에는 큰따옴표만 씁니다. 작은따옴표는 문법에 포함되지 않습니다.
  • 주석은 없습니다. 허용되는 채움은 공백뿐입니다.
  • 쉼표는 멤버 사이 또는 요소 사이에만 들어가므로 후행 쉼표는 허용되지 않습니다.
  • 값은 객체, 배열, 숫자, 문자열 중 하나이거나 false, null, true 중 하나입니다. Infinity, NaN, undefined는 JSON 값이 아닙니다.
  • 숫자는 앞에 0이나 +를 붙일 수 없고, 소수점 양쪽에는 숫자가 있어야 하므로 012, +5, .5, 5.는 모두 잘못된 값입니다.
  • 문자열 안의 U+0000부터 U+001F까지의 제어 문자는 이스케이프해야 하므로, 문자열 속 줄바꿈 원문은 잘못된 값입니다.
  • 최상위에는 객체나 배열뿐 아니라 어떤 값이든 올 수 있습니다.

모델 출력이 흔히 깨지는 방식

문제예이 도구가 하는 일
코드 펜스와 군더더기Sure! ```json { … } ``` Hope this helpsJSON만 꺼냅니다
후행 쉼표[1, 2,]쉼표를 제거합니다
주석{"a": 1 // note}주석을 제거합니다
작은따옴표{'a': 'b'}큰따옴표로 바꿉니다
따옴표 없는 키{a: 1}키에 따옴표를 붙입니다
Python 값{"ok": True, "x": None}true와 null로 바꿔 씁니다
문자열 속 줄바꿈 원문"line one⏎line two"\n으로 이스케이프합니다
NaN 또는 undefined{"x": NaN}null로 바꿔 쓰고 값이 사라졌다고 경고합니다
중간에 잘린 응답{"items": [{"id": 1}, {"id":열린 부분을 닫고 데이터가 빠졌을 수 있다고 경고합니다

안전하게 고칠 수 있는 것과 없는 것

깨진 텍스트를 읽는 합리적인 방법이 하나뿐일 때 그 수정은 안전합니다. 후행 쉼표, 주석, 코드 펜스는 데이터의 의미를 바꾸지 않고 제거할 수 있습니다. 그 밖의 변경은 의미를 바꾸므로 표시를 남기며, 직접 확인해야 합니다. 잘린 응답을 닫으면 데이터가 빠진 유효한 JSON이 되고, NaN을 null로 바꾸면 원래 값이 사라집니다.

JSON 자체에서 오는 한계가 두 가지 있습니다. RFC 8259는 객체 안의 이름은 고유해야 하고, 그렇지 않을 때 소프트웨어의 동작은 예측할 수 없다고 합니다. 이 도구는 JSON.parse처럼 마지막 것을 유지합니다. 또한 RFC는 IEEE 754 double이 다루는 범위와 정밀도를 넘어서지 않는 것을 기대할 때 소프트웨어끼리 상호 운용이 잘 된다고 합니다. 이 도구는 숫자를 쓰신 그대로 유지하지만, 아주 긴 정수를 double로 파싱하는 프로그램은 반올림합니다. -(2^53)+1부터 (2^53)-1 사이의 정수는 정확합니다.

더 나은 방법: API에 구조화된 출력을 요청하기

복구는 차선책입니다. 모델 API는 출력을 스키마에 맞도록 제한할 수 있으며, 세 벤더는 이를 각기 다르게 문서화합니다.

  • OpenAI: Structured Outputs는 모델이 JSON Schema를 따르는 응답을 생성하도록 하는 반면, JSON mode는 유효한 JSON만 보장합니다. 거부 응답은 스키마를 따르지 않을 수 있고, 최대 토큰 한도에 도달한 응답은 불완전합니다(상태 incomplete, 이유 max_output_tokens).
  • Anthropic: 구조화된 출력은 제약된 디코딩을 사용해 응답이 스키마를 따르게 하며, 문서에는 대부분의 경우에 그렇다고 나와 있습니다. 거부(stop_reason refusal)나 max_tokens로 잘린 응답은 스키마와 맞지 않을 수 있으므로, 파싱하기 전에 stop_reason을 확인하세요.
  • Google Gemini: 모델은 지정한 스키마를 따르는 JSON을 생성하도록 설정됩니다. 의미상의 정확성은 보장되지 않으므로 값을 검증해야 하며, minLength와 maxLength 같은 일부 제약은 적용되지 않습니다.

세 벤더 어느 문서도 출력이 잘렸을 때 유효한 JSON을 약속하지 않습니다. 파싱된 결과를 믿기 전에 모델이 왜 멈췄는지 확인하세요.

출처(확인일 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

FAQ

무엇을 고쳐 주나요?

JSON 앞뒤의 코드 펜스와 텍스트를 제거합니다. 후행 쉼표와 // 또는 /* */ 주석을 제거합니다. 작은따옴표와 둥근 따옴표를 큰따옴표로 바꿉니다. 따옴표 없는 키에 따옴표를 붙입니다. True, False, None을 true, false, null로 바꿉니다. 줄 사이에 빠진 쉼표를 채웁니다. 문자열 안의 줄바꿈 원문을 이스케이프합니다. +5, .5, 0x1F 같은 숫자를 올바른 JSON 숫자로 다시 씁니다.

절대 바꾸지 않는 것은 무엇인가요?

값입니다. 문자열은 글자 그대로 유지하고, 숫자도 자릿수를 그대로 유지하므로 12345678901234567890 같은 긴 ID가 반올림되지 않습니다. 중복된 키는 JSON.parse와 같이 마지막 것이 우선합니다.

응답이 중간에 잘렸다면 어떻게 되나요?

열려 있는 문자열, 배열, 객체를 닫고 아직 값이 없는 키는 버립니다. 이렇게 하면 텍스트는 유효해지지만 완전하지는 않으므로, 결과에 데이터가 빠졌을 수 있다고 표시합니다. 잘린 결과를 그대로 믿지 말고, 모델에게 이어서 쓰게 하거나 출력 한도를 늘리세요.

NaN이나 undefined가 왜 null이 되었나요?

JSON에는 NaN, Infinity, undefined가 없습니다. 이 도구는 그 자리에 null을 쓰고 표시를 남깁니다. 원래 값이 사라지기 때문입니다.

어떤 입력은 왜 거부하나요?

생략된 항목을 대신하는 줄임표(...)나 값이 와야 할 자리에 있는 단어처럼, 분명한 해결책이 하나로 정해지지 않을 때는 추측하지 않고 멈춘 뒤 위치를 보여 줍니다.

텍스트가 서버로 전송되나요?

아니요. 복구는 브라우저 안에서 실행됩니다.

관련 도구