# FracturedJson

> Clean Markdown view of GeekNews topic #25525. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=25525](https://news.hada.io/topic?id=25525)
- GeekNews Markdown: [https://news.hada.io/topic/25525.md](https://news.hada.io/topic/25525.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2026-01-03T09:47:13+09:00
- Updated: 2026-01-03T09:47:13+09:00
- Original source: [github.com/j-brooke](https://github.com/j-brooke/FracturedJson/wiki)
- Points: 6
- Comments: 1

## Summary

**FracturedJson**은 JSON 데이터를 사람이 읽기 쉬운 형태로 재구성하면서도 **불필요한 공백을 최소화**하는 포매터입니다. 배열과 객체를 가능한 한 한 줄로 표현하고, 구조가 유사한 항목은 **테이블 형태로 정렬**해 시각적 비교를 돕습니다. 주석 보존 기능을 지원하며, .NET·JavaScript·VS Code 등 다양한 환경에서 동일한 포매팅 경험을 제공합니다.

## Topic Body

- **JSON 데이터를 사람이 읽기 쉽게** 정렬하면서도 압축된 형태로 유지하는 포매팅 유틸리티 모음  
- 배열과 객체를 가능한 한 **한 줄로 표현**하고, 구조가 유사한 경우 **테이블 형태로 정렬**  
- **주석 보존 기능**을 지원하며, JSON 표준에는 없지만 실제 사용 환경에서 흔한 주석을 함께 유지  
- **.NET 라이브러리**, **JavaScript/TypeScript 패키지**, **VS Code 확장**, **브라우저 포매터** 등 다양한 환경에서 사용 가능  
- 기존 JSON 포매터의 가독성 한계를 개선해, **개발자와 데이터 분석가의 시각적 이해도를 높이는 도구**

---

### FracturedJson 개요
- **FracturedJson**은 사람이 읽기 쉬우면서도 비교적 **컴팩트한 JSON 포맷**을 생성하는 유틸리티 모음  
  - 배열과 객체는 너무 길거나 복잡하지 않으면 한 줄로 출력  
  - 구조가 유사한 여러 줄은 **필드를 정렬해 표 형태로 표시**  
  - 긴 배열은 여러 줄에 걸쳐 여러 항목을 한 줄에 배치  
- 다양한 설정을 통해 출력 형식을 제어할 수 있으며, 대부분의 경우 기본 설정만으로도 보기 좋은 결과 생성  
- 브라우저 기반 포매터 페이지, .NET 라이브러리, JavaScript/TypeScript 패키지, VS Code 확장으로 제공  
- Python용 옵션도 별도로 안내되어 있음  

### Motivation
- 대부분의 JSON 라이브러리는 **두 가지 형식**만 제공  
  - **Minified JSON**: 효율적이지만 사람이 읽기 어려움  
  - **Beautified/Indented JSON**: 지나치게 넓게 퍼져 있어 빠른 파악이 어려움  
- FracturedJson은 사람이 직접 작성하듯 데이터를 포맷  
  - 너무 복잡하거나 긴 경우를 제외하고 **컨테이너를 한 줄로 유지**  
  - 유사한 배열이나 객체는 **테이블 형태로 정렬**  

### 작동 방식 (How It Works)
- FracturedJson은 네 가지 포매팅 유형을 사용  
  1. **Inlined**: 짧고 단순한 객체나 배열을 한 줄로 표현  
     - `MaxInlineComplexity` 설정으로 허용되는 중첩 수준 제어  
  2. **Compact Multiline Array**: 여러 항목을 한 줄에 배치하되 여러 줄로 나누어 표시  
     - `MaxCompactArrayComplexity`로 중첩 허용도 조정, `-1`로 비활성화 가능  
  3. **Table**: 유사한 구조의 항목을 **열 맞춤 형태**로 정렬  
     - 내부 컨테이너가 너무 복잡할 경우 일부만 축소  
     - `MaxTableRowComplexity`와 `TableCommaPlacement`로 제어 가능  
  4. **Expanded**: 위 조건에 맞지 않는 경우, 각 항목을 여러 줄로 들여쓰기하여 표시  

### 주석 처리
- JSON 표준은 주석을 허용하지 않지만, FracturedJson은 **주석 보존 기능**을 지원  
  - 주석은 관련된 요소와 함께 유지되며, 다중 행 주석과 인라인 주석 모두 처리 가능  

### Discussions
- 사용자 질문, 피드백, 제안 등을 위한 **GitHub Discussions** 공간 제공  
- 프로젝트 관련 토론 및 개선 제안 가능

## Comments



### Comment 48603

- Author: neo
- Created: 2026-01-03T09:47:13+09:00
- Points: 1

###### [Hacker News 의견들](https://news.ycombinator.com/item?id=46464235) 
- 현재 이 프로젝트에는 두 가지 유지 관리 중인 구현체가 있음  
  하나는 C# 버전([FracturedJson .NET Library](https://github.com/j-brooke/FracturedJson/wiki/.NET-Library)), 다른 하나는 TypeScript/JavaScript 버전([FracturedJsonJs](https://github.com/j-brooke/FracturedJsonJs))임  
  예전에는 순수 Python 버전도 있었지만 이제는 유지되지 않으며, 대신 C# 코드를 감싼 Python 래퍼([fractured-json](https://pypi.org/project/fractured-json/))로 대체되었음  
  이 Python 버전은 .NET 런타임이 필요하다고 명시되어 있어, **pip install**만으로는 설치가 어려운 점이 단점임  
  이런 상황은 언어에 독립적인 **conformance suite**를 만들 좋은 기회라고 생각함 — 여러 구현체가 동일하게 동작하는지 검증할 수 있는 데이터 기반 테스트 세트 말임  
  참고로 예전 Python 버전은 이미 이런 형태의 테스트를 사용하고 있었음 ([compact-json 테스트 데이터](https://github.com/masaccio/compact-json/tree/main/tests/data))
  - 방금 Rust로 포팅했고, 앞으로 유지보수할 계획임  
    원 댓글에 추가해도 좋을 듯함  
    자세한 내용은 [fracturedjson-rs GitHub](https://github.com/fcoury/fracturedjson-rs)와 [crates.io 패키지](https://crates.io/crates/fracturedjson) 참고  
    관련 설명 댓글은 [여기](https://news.ycombinator.com/item?id=46468641)에 있음
  - 좋은 아이디어이지만, 테스트 케이스를 넘어선 **프로그램 동등성 보장**까지는 어렵다고 생각함
  - 이건 거의 **순수 함수**에 가까워서 테스트 하네스를 작성하기 아주 쉬움
  - 데이터 기반 테스트는 라이브러리에 대한 **신뢰 구축**에 매우 효과적임  
    html5lib-tests나 내가 만든 xss-bench도 그런 예시임

- Rust로 포팅한 버전을 만들었고, CLI 도구를 통해 JSON을 이 포맷으로 정렬할 수 있음  
  [fracturedjson-rs](https://github.com/fcoury/fracturedjson-rs)와 [crates.io 패키지](https://crates.io/crates/fracturedjson)에서 설치 가능함 (`cargo install fracturedjson`)  
  다양한 옵션을 제공하며, **주석 처리 방식**, **들여쓰기 스타일**, **라인 폭 제한** 등 세밀한 제어가 가능함
  - 포팅 버전도 **파생 저작물**이므로 원 저자의 저작권 표기를 유지해야 함

- 이 프로젝트 정말 멋짐  
  JSON을 더 **사람이 읽기 쉽게** 만드는 방향이 좋음  
  나는 반대로 JSON을 더 **기계 친화적**으로 만든 [bonjson](https://github.com/kstenerud/bonjson/)을 개발 중임  
  JSON과 완전히 동일한 기능과 제약을 가지며, 35배 빠르게 읽고 쓸 수 있음  
  새로운 타입이나 기능은 없고, JSON이 할 수 있는 일만 정확히 수행함
  - JSON은 단순한 표기법이라 **정형 데이터 모델**이 필요하다고 생각함  
    예를 들어 숫자의 비트 폭이나 정수/부동소수 구분이 명시되어 있지 않음  
    이런 모델이 생기면 표현 간 1:1 매핑이 가능해질 것임  
    관련 주제로 [이 글](https://replicated.wiki/blog/args.html)을 쓰고 있음
  - 흥미롭지만, “JSON이 할 수 있는 건 다 할 수 있다”는 주장에 비해 **보안상의 제한**이 다소 의외임  
    예를 들어 `"a\u0000b"` 같은 문자열은 유효한 JSON인데, 이를 직렬화하지 못한다면 그 주장은 완전히 성립하지 않음
  - 어떤 계기로 이걸 만들게 되었는지 궁금함  
    나는 JSON과 바이너리 파일을 공통 인터페이스로 저장/로드하는 **직렬화기**를 만든 적이 있음  
    내 경험상 JSON은 **제한이 많고 이점이 적은** 포맷이었음  
    그래서 쉼표, 콜론, 따옴표를 생략할 수 있고, 멀티라인 문자열과 주석을 허용하는 느슨한 포맷으로 바꿨음  
    JSON이 항상 “사람이 읽기 좋은” 포맷인 척하는 건 이제 그만했으면 함  
    비 JSON 중심 환경을 위한 표준 대안이 필요함
  - 최근에 올라온 [Lite3](https://github.com/fastserial/lite3)가 떠오름
  - **압축률**은 어떤지 궁금함

- 놀라움  
  나도 비슷한 기능을 Python으로 약 200줄 정도로 구현했는데, 이미 이런 라이브러리가 있는 줄 몰랐음

- jq처럼 **파이프 입력**을 받을 수 있는 옵션이 있는지 궁금함
  - 저장소 내 [C# CLI 코드](https://github.com/j-brooke/FracturedJson/blob/main/FracturedJsonCli/Cli.cs)를 보면, 표준 입력/출력 또는 파일을 지정할 수 있음  
    JavaScript 버전과 Python 래퍼도 동일한 CLI 도구를 제공함
  - [RCL](https://github.com/ruuda/rcl)은 기본적으로 pretty-print를 수행함  
    `rcl e`로 RCL 포맷을, `rcl je`로 JSON 출력을 볼 수 있음  
    FracturedJson처럼 테이블 정렬은 없지만, **Philip Wadler의 A Prettier Printer** 알고리즘을 기반으로 하여 폭에 맞게 자동 줄바꿈함
  - `<()` 프로세스 치환으로 임시 파일을 만들어 처리할 수도 있음
  - 대부분의 경우 입력 파일 이름을 `-`로 지정하면 **stdin**에서 읽을 수 있음

- 나는 [Virtuous](https://marketplace.visualstudio.com/items?itemName=karyfoundation.virtuous-vscode)라는 JSON 포매터를 만들었는데, 이걸 보고 내 포매터를 버릴 생각이 들 정도로 인상적임  
  정말 **훌륭한 작업**임

- 나는 “mommyjson”이라는 **Groovy 스크립트**를 만들었음  
  JSON 포맷을 유지하기보다는 각 요소의 **부모 관계**(배열 인덱스, 객체 이름 등)를 한 줄에 표시해, 데이터의 위치를 직관적으로 파악할 수 있게 함  
  [코드 보기](https://github.com/zaboople/bin/blob/master/mommyjson.groovy)  
  Groovy가 인기 없어서 Python 포트가 생기면 좋겠음
  - 좋은 아이디어임! 이런 도구가 여럿 존재하는 걸 보면 사람들이 확실히 필요로 하는 기능 같음  
    대표적으로 [gron](https://github.com/tomnomnom/gron)과 내가 만든 [jstream](https://github.com/ckampfe/jstream)이 있음  
    **사용 예시 출력**을 추가하면 더 이해하기 쉬울 듯함
  - 출력 예시가 있는지 궁금함

- JSON이 정말 **사람이 읽기 좋게 개선될 필요**가 있는 포맷인지 의문임  
  사용자에게 데이터를 보여주는 더 나은 방법이 많고, JSON은 시스템 간 데이터 전송용으로 쓰는 게 맞다고 생각함
  - 이런 도구를 쓰는 이유는 보통 **명확한 스키마나 시각화 도구가 없을 때**임  
    복잡한 중첩 데이터를 빠르게 파악해야 하는 디버깅 상황에서 유용함  
    특히 외부 시스템과의 통합 코드 작업 시 자주 발생함
  - 나도 종종 JSON 데이터를 읽기 위해 jq나 `python -m json.tool`을 사용함  
    이런 도구가 그보다 더 잘 보여준다면 충분히 가치 있음
  - 사람이 읽는 요소를 버리면 JSON은 **비효율적인 인코딩**임  
    결국 JSON의 장점은 **사람과 기계가 모두 읽을 수 있음**에 있으므로, 디버깅용으로는 여전히 의미가 있음

- 이 아이디어가 정말 마음에 듦  
  현재 채택이 느린 이유는 대부분의 언어와 **패키지 매니저(homebrew 등)** 지원이 부족하기 때문임  
  .NET 라이브러리를 C 호환 공유 라이브러리로 컴파일하면 여러 언어에서 쉽게 쓸 수 있을 것임

- 흥미로운 접근임  
  코드 포매터도 이런 식으로 작동하면 좋겠음  
  지금의 포매터들은 너무 **경직되어 있어서 구조를 파악하기 어려움**
  - 나는 C++ 포매터를 만들었는데, **탭 정렬 테이블**과 **단일 행 블록** 두 가지 객체만 사용함  
    주석은 오른쪽 정렬로 맞춰서 깔끔하게 배치됨  
    이런 구조 덕분에 switch-case 블록이나 매크로 테이블도 쉽게 2D로 정렬 가능함  
    기본 레이어는 한 시간 만에 코딩했고, LSP와 코드 관찰을 조합해 블록을 자동 감지하도록 설계 중임
  - 예전에 **XML 포매터**를 직접 만들어 테이블 형태로 보이게 했던 경험이 있음  
    이상적으로는 XML을 버렸어야 했지만, **레거시 제약** 때문에 어쩔 수 없었음
