C#로 양방향 TOON 파서 구축: TOON JSON을 쉽게 변환

발행: (2025년 12월 8일 오후 05:49 GMT+9)
5 min read
원문: Dev.to

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);

출력

TOON to JSON result

Formatted 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);

출력

JSON to TOON result

양방향 변환이 완벽히 작동합니다.

4단계: 프로젝트에 통합하기

이 파서는 다음과 같은 경우에 적합합니다:

  • AI 에이전트
  • LLM 프롬프트 최적화
  • 메모리 효율적인 데이터 전송
  • 채팅 기반 구조화 데이터
  • 내부 DSL
  • AI 워크플로를 위한 설정 파일

TOON은 매우 작기 때문에 프롬프트가 깔끔하고 토큰 친화적입니다.

요약

이 글에서는 다음을 다루었습니다:

  • 가벼운 양방향 TOON 파서 만들기
  • TOON → JSON 변환
  • JSON → TOON 변환
  • 다중 블록·다중 행 구조 데이터 처리

TOON은 AI 시대의 JSON 대안으로 빠르게 자리 잡고 있으며, 자체 파서를 보유하면 향후 워크플로에 최대한의 유연성을 제공할 수 있습니다.

Back to Blog

관련 글

더 보기 »