FracturedJson
(github.com/j-brooke)- 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은 네 가지 포매팅 유형을 사용
-
Inlined: 짧고 단순한 객체나 배열을 한 줄로 표현
-
MaxInlineComplexity설정으로 허용되는 중첩 수준 제어
-
-
Compact Multiline Array: 여러 항목을 한 줄에 배치하되 여러 줄로 나누어 표시
-
MaxCompactArrayComplexity로 중첩 허용도 조정,-1로 비활성화 가능
-
-
Table: 유사한 구조의 항목을 열 맞춤 형태로 정렬
- 내부 컨테이너가 너무 복잡할 경우 일부만 축소
-
MaxTableRowComplexity와TableCommaPlacement로 제어 가능
- Expanded: 위 조건에 맞지 않는 경우, 각 항목을 여러 줄로 들여쓰기하여 표시
-
Inlined: 짧고 단순한 객체나 배열을 한 줄로 표현
주석 처리
- JSON 표준은 주석을 허용하지 않지만, FracturedJson은 주석 보존 기능을 지원
- 주석은 관련된 요소와 함께 유지되며, 다중 행 주석과 인라인 주석 모두 처리 가능
Discussions
- 사용자 질문, 피드백, 제안 등을 위한 GitHub Discussions 공간 제공
- 프로젝트 관련 토론 및 개선 제안 가능
Hacker News 의견들
-
현재 이 프로젝트에는 두 가지 유지 관리 중인 구현체가 있음
하나는 C# 버전(FracturedJson .NET Library), 다른 하나는 TypeScript/JavaScript 버전(FracturedJsonJs)임
예전에는 순수 Python 버전도 있었지만 이제는 유지되지 않으며, 대신 C# 코드를 감싼 Python 래퍼(fractured-json)로 대체되었음
이 Python 버전은 .NET 런타임이 필요하다고 명시되어 있어, pip install만으로는 설치가 어려운 점이 단점임
이런 상황은 언어에 독립적인 conformance suite를 만들 좋은 기회라고 생각함 — 여러 구현체가 동일하게 동작하는지 검증할 수 있는 데이터 기반 테스트 세트 말임
참고로 예전 Python 버전은 이미 이런 형태의 테스트를 사용하고 있었음 (compact-json 테스트 데이터)- 방금 Rust로 포팅했고, 앞으로 유지보수할 계획임
원 댓글에 추가해도 좋을 듯함
자세한 내용은 fracturedjson-rs GitHub와 crates.io 패키지 참고
관련 설명 댓글은 여기에 있음 - 좋은 아이디어이지만, 테스트 케이스를 넘어선 프로그램 동등성 보장까지는 어렵다고 생각함
- 이건 거의 순수 함수에 가까워서 테스트 하네스를 작성하기 아주 쉬움
- 데이터 기반 테스트는 라이브러리에 대한 신뢰 구축에 매우 효과적임
html5lib-tests나 내가 만든 xss-bench도 그런 예시임
- 방금 Rust로 포팅했고, 앞으로 유지보수할 계획임
-
Rust로 포팅한 버전을 만들었고, CLI 도구를 통해 JSON을 이 포맷으로 정렬할 수 있음
fracturedjson-rs와 crates.io 패키지에서 설치 가능함 (cargo install fracturedjson)
다양한 옵션을 제공하며, 주석 처리 방식, 들여쓰기 스타일, 라인 폭 제한 등 세밀한 제어가 가능함- 포팅 버전도 파생 저작물이므로 원 저자의 저작권 표기를 유지해야 함
-
이 프로젝트 정말 멋짐
JSON을 더 사람이 읽기 쉽게 만드는 방향이 좋음
나는 반대로 JSON을 더 기계 친화적으로 만든 bonjson을 개발 중임
JSON과 완전히 동일한 기능과 제약을 가지며, 35배 빠르게 읽고 쓸 수 있음
새로운 타입이나 기능은 없고, JSON이 할 수 있는 일만 정확히 수행함- JSON은 단순한 표기법이라 정형 데이터 모델이 필요하다고 생각함
예를 들어 숫자의 비트 폭이나 정수/부동소수 구분이 명시되어 있지 않음
이런 모델이 생기면 표현 간 1:1 매핑이 가능해질 것임
관련 주제로 이 글을 쓰고 있음 - 흥미롭지만, “JSON이 할 수 있는 건 다 할 수 있다”는 주장에 비해 보안상의 제한이 다소 의외임
예를 들어"a\u0000b"같은 문자열은 유효한 JSON인데, 이를 직렬화하지 못한다면 그 주장은 완전히 성립하지 않음 - 어떤 계기로 이걸 만들게 되었는지 궁금함
나는 JSON과 바이너리 파일을 공통 인터페이스로 저장/로드하는 직렬화기를 만든 적이 있음
내 경험상 JSON은 제한이 많고 이점이 적은 포맷이었음
그래서 쉼표, 콜론, 따옴표를 생략할 수 있고, 멀티라인 문자열과 주석을 허용하는 느슨한 포맷으로 바꿨음
JSON이 항상 “사람이 읽기 좋은” 포맷인 척하는 건 이제 그만했으면 함
비 JSON 중심 환경을 위한 표준 대안이 필요함 - 최근에 올라온 Lite3가 떠오름
- 압축률은 어떤지 궁금함
- JSON은 단순한 표기법이라 정형 데이터 모델이 필요하다고 생각함
-
놀라움
나도 비슷한 기능을 Python으로 약 200줄 정도로 구현했는데, 이미 이런 라이브러리가 있는 줄 몰랐음 -
jq처럼 파이프 입력을 받을 수 있는 옵션이 있는지 궁금함
- 저장소 내 C# CLI 코드를 보면, 표준 입력/출력 또는 파일을 지정할 수 있음
JavaScript 버전과 Python 래퍼도 동일한 CLI 도구를 제공함 -
RCL은 기본적으로 pretty-print를 수행함
rcl e로 RCL 포맷을,rcl je로 JSON 출력을 볼 수 있음
FracturedJson처럼 테이블 정렬은 없지만, Philip Wadler의 A Prettier Printer 알고리즘을 기반으로 하여 폭에 맞게 자동 줄바꿈함 -
<()프로세스 치환으로 임시 파일을 만들어 처리할 수도 있음 - 대부분의 경우 입력 파일 이름을
-로 지정하면 stdin에서 읽을 수 있음
- 저장소 내 C# CLI 코드를 보면, 표준 입력/출력 또는 파일을 지정할 수 있음
-
나는 Virtuous라는 JSON 포매터를 만들었는데, 이걸 보고 내 포매터를 버릴 생각이 들 정도로 인상적임
정말 훌륭한 작업임 -
나는 “mommyjson”이라는 Groovy 스크립트를 만들었음
JSON 포맷을 유지하기보다는 각 요소의 부모 관계(배열 인덱스, 객체 이름 등)를 한 줄에 표시해, 데이터의 위치를 직관적으로 파악할 수 있게 함
코드 보기
Groovy가 인기 없어서 Python 포트가 생기면 좋겠음 -
JSON이 정말 사람이 읽기 좋게 개선될 필요가 있는 포맷인지 의문임
사용자에게 데이터를 보여주는 더 나은 방법이 많고, JSON은 시스템 간 데이터 전송용으로 쓰는 게 맞다고 생각함- 이런 도구를 쓰는 이유는 보통 명확한 스키마나 시각화 도구가 없을 때임
복잡한 중첩 데이터를 빠르게 파악해야 하는 디버깅 상황에서 유용함
특히 외부 시스템과의 통합 코드 작업 시 자주 발생함 - 나도 종종 JSON 데이터를 읽기 위해 jq나
python -m json.tool을 사용함
이런 도구가 그보다 더 잘 보여준다면 충분히 가치 있음 - 사람이 읽는 요소를 버리면 JSON은 비효율적인 인코딩임
결국 JSON의 장점은 사람과 기계가 모두 읽을 수 있음에 있으므로, 디버깅용으로는 여전히 의미가 있음
- 이런 도구를 쓰는 이유는 보통 명확한 스키마나 시각화 도구가 없을 때임
-
이 아이디어가 정말 마음에 듦
현재 채택이 느린 이유는 대부분의 언어와 패키지 매니저(homebrew 등) 지원이 부족하기 때문임
.NET 라이브러리를 C 호환 공유 라이브러리로 컴파일하면 여러 언어에서 쉽게 쓸 수 있을 것임 -
흥미로운 접근임
코드 포매터도 이런 식으로 작동하면 좋겠음
지금의 포매터들은 너무 경직되어 있어서 구조를 파악하기 어려움- 나는 C++ 포매터를 만들었는데, 탭 정렬 테이블과 단일 행 블록 두 가지 객체만 사용함
주석은 오른쪽 정렬로 맞춰서 깔끔하게 배치됨
이런 구조 덕분에 switch-case 블록이나 매크로 테이블도 쉽게 2D로 정렬 가능함
기본 레이어는 한 시간 만에 코딩했고, LSP와 코드 관찰을 조합해 블록을 자동 감지하도록 설계 중임 - 예전에 XML 포매터를 직접 만들어 테이블 형태로 보이게 했던 경험이 있음
이상적으로는 XML을 버렸어야 했지만, 레거시 제약 때문에 어쩔 수 없었음
- 나는 C++ 포매터를 만들었는데, 탭 정렬 테이블과 단일 행 블록 두 가지 객체만 사용함