JSON과 TOON은 모두 구조화된 데이터를 나타냅니다. 둘 다 텍스트 기반입니다. 둘 다 객체, 배열, 중첩 계층을 설명할 수 있습니다. TOON을 발견하고 존재하지 않는 문제를 해결하려는 또 다른 JSON 대안인지 궁금했다면 — 그것은 공정한 질문입니다. 답은: 둘 다 완전히 다른 작업에 최적화되어 있으며, 한눈에 보면 선택이 명확해집니다.

JSON은 데이터 교환의 범용 언어입니다. 10년 이상 REST API의 근간이었으며, 모든 현대 프로그래밍 언어에서 기본적으로 지원되고, 기본값으로 선택하는 형식입니다. TOON은 더 좁은 사명을 가진 새로운 형식입니다: 대형 언어 모델에서 구조화된 데이터를 주고받을 때 토큰 사용을 최소화합니다. 동일한 기본 데이터, 근본적으로 다른 풋프린트.

JSON의 강점

JSON의 초능력은 보편성입니다. RFC 8259 사양은 몇 페이지에 들어갈 만큼 간단해서, Python에서 Go, Rust까지 모든 언어가 표준 라이브러리나 에코시스템에 일급 JSON 파서를 갖추고 있습니다. 아무것도 설치할 필요가 없습니다. 동료에게 형식을 설명할 필요가 없습니다. 그리고 도구 — 포매터, 검증기, 스키마 검증기 — 는 어디서나 사용할 수 있습니다.

  • 보편적으로 지원됨. 모든 언어, 모든 런타임, 모든 클라우드 서비스가 JSON을 기본으로 지원합니다.
  • 사람이 읽을 수 있음. 키는 따옴표로 묶인 문자열이며, 중괄호와 괄호로 구조가 명시됩니다.
  • 타입이 있는 기본 요소. 숫자, 불리언, null, 문자열, 배열, 객체 — 모두 명확하게 표현됩니다.
  • 풍부한 도구. 린터, 포매터, JSON Schema 검증기, JSONPath 쿼리 엔진 — 에코시스템이 방대합니다.
  • REST API 표준. Content-Type: application/json은 거의 모든 HTTP API에서 기본 기대값입니다.

TOON이 다른 점

TOON은 하나의 특정 제약을 염두에 두고 구축되었습니다: LLM 컨텍스트 창과 토큰 비용. OpenAI API나 다른 LLM 공급자를 호출할 때 토큰당 비용을 지불합니다. 토큰은 문자가 아닙니다 — 대략 단어 조각이며, JSON의 구조적 구두점(따옴표, 콜론, 쉼표, 중괄호)은 놀랍도록 많은 수를 소비합니다. 특히 표 형식 데이터의 경우 JSON은 낭비적입니다: 모든 행이 모든 키 이름을 반복합니다.

TOON은 압축 표기법으로 이를 해결합니다. 표 형식 데이터의 경우, 키는 헤더에 한 번 선언되고 행은 일반 쉼표로 구분된 값입니다. 단일 객체와 배열의 경우 간결한 인라인 구문을 사용합니다. OpenAI 토크나이저는 실제로 차이를 보는 데 유용한 도구입니다 — 동일한 데이터를 두 형식으로 붙여넣고 토큰 수를 직접 비교해 보세요.

나란히 비교: 10행 데이터셋

다음은 JSON에서 10개 행의 제품 테이블입니다 — LLM에 전달하여 가격을 분석하거나 항목을 분류하도록 요청할 때 사용하는 종류의 데이터:

json
[
  {"id": 1,  "name": "Wireless Mouse",      "category": "Electronics", "price": 29.99, "inStock": true},
  {"id": 2,  "name": "USB-C Hub",           "category": "Electronics", "price": 49.99, "inStock": true},
  {"id": 3,  "name": "Mechanical Keyboard", "category": "Electronics", "price": 89.99, "inStock": false},
  {"id": 4,  "name": "Monitor Stand",       "category": "Furniture",   "price": 39.99, "inStock": true},
  {"id": 5,  "name": "Webcam HD",           "category": "Electronics", "price": 69.99, "inStock": true},
  {"id": 6,  "name": "Desk Mat",            "category": "Accessories", "price": 19.99, "inStock": true},
  {"id": 7,  "name": "Laptop Stand",        "category": "Furniture",   "price": 34.99, "inStock": false},
  {"id": 8,  "name": "LED Desk Lamp",       "category": "Furniture",   "price": 44.99, "inStock": true},
  {"id": 9,  "name": "Cable Organiser",     "category": "Accessories", "price": 14.99, "inStock": true},
  {"id": 10, "name": "Headphone Hook",      "category": "Accessories", "price": 12.99, "inStock": false}
]

이제 동일한 데이터를 TOON으로. 키는 헤더에 한 번 선언됩니다 — 행에는 값만 포함됩니다:

text
products[10]{id,name,category,price,inStock}:
  1,Wireless Mouse,Electronics,29.99,true
  2,USB-C Hub,Electronics,49.99,true
  3,Mechanical Keyboard,Electronics,89.99,false
  4,Monitor Stand,Furniture,39.99,true
  5,Webcam HD,Electronics,69.99,true
  6,Desk Mat,Accessories,19.99,true
  7,Laptop Stand,Furniture,34.99,false
  8,LED Desk Lamp,Furniture,44.99,true
  9,Cable Organiser,Accessories,14.99,true
  10,Headphone Hook,Accessories,12.99,false
실제 토큰 절약: 위 JSON 버전은 OpenAI 토크나이저에서 약 420 토큰입니다. TOON 버전은 약 195 토큰 — 절반 미만입니다. 규모에서(하루 수천 건의 API 호출 또는 수백 개 행의 데이터셋) 그 차이는 실제 돈이 됩니다.

JavaScript / TypeScript에서 TOON 사용

@toon-format/toon npm 패키지가 인코딩과 디코딩을 처리합니다. 한 번 설치하면 API가 간단합니다:

bash
npm install @toon-format/toon
ts
import { encode, decode } from '@toon-format/toon';

const products = [
  { id: 1, name: 'Wireless Mouse', category: 'Electronics', price: 29.99, inStock: true },
  { id: 2, name: 'USB-C Hub',      category: 'Electronics', price: 49.99, inStock: true },
  // ...더 많은 행
];

// LLM에 보내기 전에 TOON으로 인코딩
const toonString = encode(products);
// products[2]{id,name,category,price,inStock}:
//   1,Wireless Mouse,Electronics,29.99,true
//   2,USB-C Hub,Electronics,49.99,true

// LLM이 반환할 때 TOON을 일반 JS 배열로 디코딩
const decoded = decode(toonString);
console.log(decoded[0].name); // "Wireless Mouse"

단일 객체를 인라인으로 인코딩할 수도 있습니다. TOON의 객체 표기법은 키를 따옴표로 묶지 않고 중괄호를 사용하며, 배열 표기법은 단순히 대괄호 안에 쉼표로 구분된 값입니다:

text
// TOON object
{name:Alice,age:30,role:admin}

// TOON array
[1,2,3,4,5]

TOON을 사용해야 하는 경우

  • 구조화된 데이터가 있는 LLM 프롬프트. 테이블, 레코드 목록, 또는 제품 카탈로그를 GPT-4 / Claude / Gemini 호출에 제공. 토큰 절약은 API 비용을 직접 절감합니다.
  • LLM 출력 파싱. LLM에게 TOON으로 응답하도록 지시하면, 입력과 출력 토큰 모두에서 응답이 더 짧고 저렴합니다.
  • 특히 표 형식 데이터. TOON의 헤더-한번-그다음-행 구조는 테이블 형태의 모든 것에 대해 JSON보다 훨씬 더 압축됩니다.
  • 배치 처리 파이프라인. 매일 수천 개의 레코드를 LLM을 통해 실행하나요? 40% 토큰 감소도 빠르게 누적됩니다.
  • 컨텍스트 창 압박. 모델의 컨텍스트 한계에 부딪힐 때, TOON을 사용하면 같은 창에 더 많은 데이터를 맞출 수 있습니다.

JSON을 계속 사용해야 하는 경우

  • REST API. 모든 HTTP 클라이언트, 모든 서버 프레임워크, 모든 API 게이트웨이가 JSON을 사용합니다. 관례를 깨지 마세요.
  • 설정 파일. package.json, tsconfig.json, settings.json — JSON은 대부분의 에코시스템에서 설정의 표준입니다.
  • 데이터베이스 저장. PostgreSQL의 jsonb, MongoDB 문서, DynamoDB — 이것들은 JSON 기본입니다. TOON은 여기에 속하지 않습니다.
  • 서비스 간 통신. 두 서비스가 서로 통신할 때 JSON을 사용하세요. 로깅, 추적, 모니터링 도구가 이해하는 것입니다.
  • 공개 API. 외부 개발자가 API를 사용하는 경우, JSON이 기대되는 계약입니다. TOON은 내부 최적화이지, 공개 인터페이스 형식이 아닙니다.
  • 브라우저 기본 파싱. JSON.parse()는 모든 브라우저에 내장되어 있습니다. TOON은 라이브러리가 필요합니다.

결정 가이드

질문을 해결하기 위한 빠른 체크리스트:

  • 데이터가 LLM 프롬프트에 들어가나요? TOON을 사용하세요.
  • LLM이 구조화된 데이터를 반환할 것으로 예상되나요? TOON을 사용하세요.
  • 데이터가 표 형식인가요(많은 행에 걸쳐 동일한 키)? TOON을 강력히 고려하세요.
  • REST API 요청 또는 응답인가요? JSON을 사용하세요.
  • 설정 파일인가요? JSON(또는 YAML)을 사용하세요.
  • 데이터베이스에 저장되나요? JSON을 사용하세요.
  • 비-LLM 도구가 이 데이터를 사용할 것인가요? JSON을 사용하세요.
  • 토큰 비용이 사용 사례에 중요한지 확실하지 않으신가요? JSON으로 시작하고, 나중에 최적화하세요.

유용한 도구

두 형식 모두 작업하는 경우 이 도구들이 시간을 절약해 줄 것입니다. LLM 입력을 위한 압축 TOON 표현을 생성하려면 JSON to TOON 변환기를 사용하세요. TOON to JSON 변환기는 반대 방향으로 갑니다 — LLM이 TOON을 반환하고 JSON 기반 다운스트림 시스템에 결과를 제공해야 할 때 유용합니다. TOON Formatter는 TOON 문자열을 정리하고 검증하며, JSON Formatter는 원시 JSON 블롭을 보기 좋게 만드는 데 여전히 최고입니다.

마무리

JSON과 TOON은 전통적인 의미에서 경쟁자가 아닙니다 — 스택의 다른 부분을 대상으로 합니다. JSON은 API 레이어, 설정 파일, 데이터 저장소를 소유합니다. TOON은 토큰 수가 돈이고 컨텍스트 창 공간이 귀중한 LLM 레이어를 소유합니다. 좋은 소식은 마찰 없이 동일한 프로젝트에서 둘 다 사용할 수 있다는 것입니다: JSON으로 데이터를 저장하고 전송하고, LLM 호출 직전에 TOON으로 인코딩하고, 나올 때 JSON이나 기본 객체로 다시 디코딩합니다. 그 패턴을 설정하면 토큰 절약은 자동으로 됩니다.