6P by GN⁺ 2달전 | ★ favorite | 댓글 1개
  • 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: 유사한 구조의 항목을 열 맞춤 형태로 정렬
      • 내부 컨테이너가 너무 복잡할 경우 일부만 축소
      • MaxTableRowComplexityTableCommaPlacement로 제어 가능
    4. Expanded: 위 조건에 맞지 않는 경우, 각 항목을 여러 줄로 들여쓰기하여 표시

주석 처리

  • 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 GitHubcrates.io 패키지 참고
      관련 설명 댓글은 여기에 있음
    • 좋은 아이디어이지만, 테스트 케이스를 넘어선 프로그램 동등성 보장까지는 어렵다고 생각함
    • 이건 거의 순수 함수에 가까워서 테스트 하네스를 작성하기 아주 쉬움
    • 데이터 기반 테스트는 라이브러리에 대한 신뢰 구축에 매우 효과적임
      html5lib-tests나 내가 만든 xss-bench도 그런 예시임
  • Rust로 포팅한 버전을 만들었고, CLI 도구를 통해 JSON을 이 포맷으로 정렬할 수 있음
    fracturedjson-rscrates.io 패키지에서 설치 가능함 (cargo install fracturedjson)
    다양한 옵션을 제공하며, 주석 처리 방식, 들여쓰기 스타일, 라인 폭 제한 등 세밀한 제어가 가능함

    • 포팅 버전도 파생 저작물이므로 원 저자의 저작권 표기를 유지해야 함
  • 이 프로젝트 정말 멋짐
    JSON을 더 사람이 읽기 쉽게 만드는 방향이 좋음
    나는 반대로 JSON을 더 기계 친화적으로 만든 bonjson을 개발 중임
    JSON과 완전히 동일한 기능과 제약을 가지며, 35배 빠르게 읽고 쓸 수 있음
    새로운 타입이나 기능은 없고, JSON이 할 수 있는 일만 정확히 수행함

    • JSON은 단순한 표기법이라 정형 데이터 모델이 필요하다고 생각함
      예를 들어 숫자의 비트 폭이나 정수/부동소수 구분이 명시되어 있지 않음
      이런 모델이 생기면 표현 간 1:1 매핑이 가능해질 것임
      관련 주제로 이 글을 쓰고 있음
    • 흥미롭지만, “JSON이 할 수 있는 건 다 할 수 있다”는 주장에 비해 보안상의 제한이 다소 의외임
      예를 들어 "a\u0000b" 같은 문자열은 유효한 JSON인데, 이를 직렬화하지 못한다면 그 주장은 완전히 성립하지 않음
    • 어떤 계기로 이걸 만들게 되었는지 궁금함
      나는 JSON과 바이너리 파일을 공통 인터페이스로 저장/로드하는 직렬화기를 만든 적이 있음
      내 경험상 JSON은 제한이 많고 이점이 적은 포맷이었음
      그래서 쉼표, 콜론, 따옴표를 생략할 수 있고, 멀티라인 문자열과 주석을 허용하는 느슨한 포맷으로 바꿨음
      JSON이 항상 “사람이 읽기 좋은” 포맷인 척하는 건 이제 그만했으면 함
      비 JSON 중심 환경을 위한 표준 대안이 필요함
    • 최근에 올라온 Lite3가 떠오름
    • 압축률은 어떤지 궁금함
  • 놀라움
    나도 비슷한 기능을 Python으로 약 200줄 정도로 구현했는데, 이미 이런 라이브러리가 있는 줄 몰랐음

  • jq처럼 파이프 입력을 받을 수 있는 옵션이 있는지 궁금함

    • 저장소 내 C# CLI 코드를 보면, 표준 입력/출력 또는 파일을 지정할 수 있음
      JavaScript 버전과 Python 래퍼도 동일한 CLI 도구를 제공함
    • RCL은 기본적으로 pretty-print를 수행함
      rcl e로 RCL 포맷을, rcl je로 JSON 출력을 볼 수 있음
      FracturedJson처럼 테이블 정렬은 없지만, Philip Wadler의 A Prettier Printer 알고리즘을 기반으로 하여 폭에 맞게 자동 줄바꿈함
    • <() 프로세스 치환으로 임시 파일을 만들어 처리할 수도 있음
    • 대부분의 경우 입력 파일 이름을 -로 지정하면 stdin에서 읽을 수 있음
  • 나는 Virtuous라는 JSON 포매터를 만들었는데, 이걸 보고 내 포매터를 버릴 생각이 들 정도로 인상적임
    정말 훌륭한 작업

  • 나는 “mommyjson”이라는 Groovy 스크립트를 만들었음
    JSON 포맷을 유지하기보다는 각 요소의 부모 관계(배열 인덱스, 객체 이름 등)를 한 줄에 표시해, 데이터의 위치를 직관적으로 파악할 수 있게 함
    코드 보기
    Groovy가 인기 없어서 Python 포트가 생기면 좋겠음

    • 좋은 아이디어임! 이런 도구가 여럿 존재하는 걸 보면 사람들이 확실히 필요로 하는 기능 같음
      대표적으로 gron과 내가 만든 jstream이 있음
      사용 예시 출력을 추가하면 더 이해하기 쉬울 듯함
    • 출력 예시가 있는지 궁금함
  • JSON이 정말 사람이 읽기 좋게 개선될 필요가 있는 포맷인지 의문임
    사용자에게 데이터를 보여주는 더 나은 방법이 많고, JSON은 시스템 간 데이터 전송용으로 쓰는 게 맞다고 생각함

    • 이런 도구를 쓰는 이유는 보통 명확한 스키마나 시각화 도구가 없을 때
      복잡한 중첩 데이터를 빠르게 파악해야 하는 디버깅 상황에서 유용함
      특히 외부 시스템과의 통합 코드 작업 시 자주 발생함
    • 나도 종종 JSON 데이터를 읽기 위해 jq나 python -m json.tool을 사용함
      이런 도구가 그보다 더 잘 보여준다면 충분히 가치 있음
    • 사람이 읽는 요소를 버리면 JSON은 비효율적인 인코딩
      결국 JSON의 장점은 사람과 기계가 모두 읽을 수 있음에 있으므로, 디버깅용으로는 여전히 의미가 있음
  • 이 아이디어가 정말 마음에 듦
    현재 채택이 느린 이유는 대부분의 언어와 패키지 매니저(homebrew 등) 지원이 부족하기 때문임
    .NET 라이브러리를 C 호환 공유 라이브러리로 컴파일하면 여러 언어에서 쉽게 쓸 수 있을 것임

  • 흥미로운 접근임
    코드 포매터도 이런 식으로 작동하면 좋겠음
    지금의 포매터들은 너무 경직되어 있어서 구조를 파악하기 어려움

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