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トークン — 半分以下です。スケール時(1日あたり数千のAPIコール、または 数百行のデータセット)、その差は実際のお金になります。

JavaScript / TypeScriptでTOONを使う

npmパッケージ@toon-format/toonが エンコードとデコードを処理します。一度インストールすれば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 },
  // ...more rows
];

// Encode to TOON before sending to an LLM
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

// Decode TOON back to a plain JS array when the LLM returns it
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.jsontsconfig.jsonsettings.json — JSONはほとんどのエコシステムで設定の標準です。
  • データベースストレージ。PostgreSQLのjsonb、MongoDBドキュメント、DynamoDB — これらはJSONネイティブです。TOONはここに属しません。
  • サービス間通信。2つのサービスが通信する場合はJSONを使用してください。ログ、トレース、監視ツールが理解するものです。
  • 公開API。外部の開発者がAPIを消費する場合、JSONが期待されるコントラクトです。TOONは内部的な最適化であり、公開インターフェース形式ではありません。
  • ブラウザネイティブの解析。JSON.parse()はすべてのブラウザに組み込まれています。TOONにはライブラリが必要です。

意思決定ガイド

問題を解決するための簡単なチェックリスト:

  • データはLLMプロンプトに入りますか? TOONを使用。
  • LLMが構造化データを返すことが期待されていますか? TOONを使用。
  • データは表形式ですか(多くの行にわたって同じキー)? TOONを強く検討。
  • これはREST APIのリクエストまたはレスポンスですか? JSONを使用。
  • これは設定ファイルですか? JSON(またはYAML)を使用。
  • これはデータベースに保存されていますか? JSONを使用。
  • 非LLMツールがこのデータを消費しますか? JSONを使用。
  • トークンコストがユースケースで重要かどうかわからない? JSONから始めて、後で最適化。

便利なツール

両方の形式を扱う場合、これらのツールで時間を節約できます。 JSON to TOONコンバーターを使って既存のJSONデータを取り、 LLM入力に対応するコンパクトなTOON表現を生成します。 TOON to JSONコンバーターは逆方向へ — LLMがTOONを返し、 結果をJSONネイティブの下流システムに供給する必要がある場合に便利です。 TOONフォーマッターはTOON文字列をクリーンアップして検証し、 JSONフォーマッターは生のJSONブロブを整形するための定番ツールです。

まとめ

JSONとTOONは伝統的な意味での競合他社ではありません — それらはスタックの異なる部分をターゲットにしています。 JSONはAPI層、設定ファイル、データストレージを担当します。TOONはLLM層を担当し、 そこではトークン数がお金であり、コンテキストウィンドウスペースが貴重です。良いニュースは、 同じプロジェクトで摩擦なく両方を使用できることです:JSONとしてデータを保存・転送し、 LLM呼び出しの直前にTOONにエンコードし、出力時にJSONまたはネイティブオブジェクトにデコードして戻します。 そのパターンを設定すれば、トークン節約は自動的になります。