C#로 양방향 TOON 파서 구축: TOON JSON을 쉽게 변환
Source: Dev.to
소개
Toon (Token‑Oriented Object Notation)은 LLM 토큰을 저장하기 위해 특별히 설계된 최신 포맷입니다.
컴팩트하고 사람이 읽기 쉬우며, 매우 가볍고, 토큰 하나하나가 중요한 AI 워크플로에 최적화되었습니다.
JSON과 비교했을 때 TOON은 잡음을 줄이고, 불필요한 중괄호/따옴표를 없애며, 구조화된 데이터를 평평하고 토큰 효율적인 방식으로 저장합니다. AI 프롬프트와 에이전트 기반 아키텍처가 부상하면서 TOON은 개발자와 머신러닝 엔지니어 사이에서 빠르게 인기를 얻고 있습니다.
이 가이드에서는 C#으로 양방향 TOON 파서를 완전히 구현하는 방법을 배웁니다:
- TOON → JSON
- JSON → TOON
- 완전 자동화, 확장 가능, 사용하기 쉬움
솔루션은 .NET 6, .NET 8, .NET 9에서 동작하며 외부 의존성이 없습니다.
1단계: ToonConverter 클래스 만들기
다음과 같은 유틸리티 클래스를 구축합니다:
ParseToon()– TOON을 C# 사전(Dictionary)으로 변환ToonToJson()– TOON을 JSON으로 변환JsonToToon()– JSON을 다시 TOON으로 변환
ToonConverter.cs 라는 새 파일을 만들고 아래 코드를 삽입합니다:
using System.Text.Json;
using System.Text.Json.Nodes;
public static class ToonConverter
{
// --------------------------------------
// 1. TOON → OBJECT (Dictionary)
// --------------------------------------
public static Dictionary>> ParseToon(string toon)
{
var result = new Dictionary>>();
var lines = toon.Split('\n', StringSplitOptions.RemoveEmptyEntries)
.Select(x => x.Trim()).ToList();
int i = 0;
while (i f.Trim()).ToArray();
var rows = new List>();
while (i v.Trim()).ToArray();
var obj = new Dictionary();
for (int f = 0; f x.Key).ToList();
sb.Append($"{name}[{arr.Count}]{{");
sb.Append(string.Join(",", fields));
sb.AppendLine("}:");
// Add rows
foreach (JsonNode? row in arr)
{
var obj = row!.AsObject();
sb.AppendLine(string.Join(",", fields.Select(f => obj[f]!.ToString())));
}
sb.AppendLine();
}
return sb.ToString().Trim();
}
}
2단계: TOON → JSON 변환 시도
예시 TOON 포맷
Characters[3]{Name,Age,Role}:
Alice,25,Warrior
Bob,30,Mage
Charlie,22,Rogue
Items[2]{ItemName,Quantity,Price}:
Sword,5,100
Potion,20,10
변환하기
string toonData = @"
Characters[3]{Name,Age,Role}:
Alice,25,Warrior
Bob,30,Mage
Charlie,22,Rogue
Items[2]{ItemName,Quantity,Price}:
Sword,5,100
Potion,20,10
";
string json = ToonConverter.ToonToJson(toonData);
Console.WriteLine(json);
출력
JSON은 깔끔하고 구조화되어 API나 저장소에 바로 사용할 수 있습니다.
3단계: JSON → TOON 변환
주어진 JSON
{
"Characters": [
{
"Name": "Alice",
"Age": "25",
"Role": "Warrior"
},
{
"Name": "Bob",
"Age": "30",
"Role": "Mage"
},
{
"Name": "Charlie",
"Age": "22",
"Role": "Rogue"
}
],
"Items": [
{
"ItemName": "Sword",
"Quantity": "5",
"Price": "100"
},
{
"ItemName": "Potion",
"Quantity": "20",
"Price": "10"
}
]
}
다시 변환하기
string toonFromJson = ToonConverter.JsonToToon(json);
Console.WriteLine(toonFromJson);
출력
양방향 변환이 완벽히 작동합니다.
4단계: 프로젝트에 통합하기
이 파서는 다음과 같은 경우에 적합합니다:
- AI 에이전트
- LLM 프롬프트 최적화
- 메모리 효율적인 데이터 전송
- 채팅 기반 구조화 데이터
- 내부 DSL
- AI 워크플로를 위한 설정 파일
TOON은 매우 작기 때문에 프롬프트가 깔끔하고 토큰 친화적입니다.
요약
이 글에서는 다음을 다루었습니다:
- 가벼운 양방향 TOON 파서 만들기
- TOON → JSON 변환
- JSON → TOON 변환
- 다중 블록·다중 행 구조 데이터 처리
TOON은 AI 시대의 JSON 대안으로 빠르게 자리 잡고 있으며, 자체 파서를 보유하면 향후 워크플로에 최대한의 유연성을 제공할 수 있습니다.


