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에 전달하여 가격을 분석하거나 항목을 분류하도록 요청할 때 사용하는 종류의 데이터:
[
{"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으로. 키는 헤더에 한 번 선언됩니다 — 행에는 값만 포함됩니다:
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,falseJavaScript / TypeScript에서 TOON 사용
@toon-format/toon npm 패키지가
인코딩과 디코딩을 처리합니다. 한 번 설치하면 API가 간단합니다:
npm install @toon-format/toonimport { 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의 객체 표기법은 키를 따옴표로 묶지 않고 중괄호를 사용하며, 배열 표기법은 단순히 대괄호 안에 쉼표로 구분된 값입니다:
// 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이나 기본 객체로 다시 디코딩합니다. 그 패턴을 설정하면 토큰 절약은 자동으로 됩니다.