대부분의 JSON 직렬화 도구는 두 가지 선택지만 제공합니다:
- 컴팩트 머신 출력:
{"a":{"b":{"c":"abc"}},"x":{"y":{"z":"xyz"}}}
- 또는 완전히 확장된 “보기 좋게 출력”:
{
"a": {
"b": {
"c": "abc"
}
},
"x": {
"y": {
"z": "xyz"
}
}
}
나는 중간의 어떤 것을 원했습니다: 첫 번째는 인간이 스캔하기 어렵고, 두 번째는 실제 세계의 중첩된 데이터에서 매우 수식적인 문장이 됩니다.
아이디어
나는 jsonfold이라는 작은 파이썬 모듈을 작성했습니다. 파이썬의 JSON 직렬화를 바꾸는 대신, json.dump() 출력 위에 가벼운 후처리 필터로 작동합니다.
포맷터는 선택적으로:
- 작은 컨테이너들을 한 줄로 돌아놓고,
- 짧은 스칼라 시퀀스들을 포장하고,
- 큰 또는 복잡한 구조들을 확장状态로 유지합니다.
예시 출력:
{
"a": { "b": { "c": "abc" } },
"x": { "y": { "z": "xyz" } }
}
왜 이 접근 방식인가요?
재작성하고 싶지 않았습니다 - 많은 좋은 시리얼라이저들이 있습니다 (내장 시리얼라이저 포함)json.dump()) 단순한 데이터 구조부터 효율적으로 처리할 수 있는 것들(list/dict) 사용자 지정 클래스 및 Python@dataclass객체를 사용하여 전환을 수행하고 출력 레이아웃을 맞춤 설정합니다.
흥미로운 부분은 포맷터가 하는 일입니다안녕하세요JSON 스트림을 다시 파싱합니다. 파일과 유사한 객체를 둘러싼 스트리밍 래퍼로 작동합니다.
json.dump(obj, JSONFoldWriter(fp), indent=2)
그러므로 큰 문서를 고정된 메모리 사용량과 선형 처리 시간으로 처리할 수 있습니다. 이 접근 방식은 대부분의 기존 시리얼라이저와 작동합니다. 또한 json.dump(), json.dumps()용 래퍼를 제공합니다.
from jsonfold import dumps
data = {
"a": {"b": {"c": "abc"}},
"x": {"y": {"z": "xyz"}},
}
print(dumps(data))
개인화
포맷터는 다음을 제어할 수 있습니다:
- 최대 줄 너비,
- 폴딩 깊이,
- 압축 적극성,
- 배열/객체 제한.
그래서 보수적인 포맷팅과 더 적극적인 압축 사이에서 선택할 수 있습니다.
전체 기사:
중간 (패이월 없음):스트리밍 JSON 포맷터는 기존 시리얼라이저와 함께 작동합니다
최소 사용법
jsonfold.py를 GitHub 프로젝트
import jsonfold
import sys
data = {
"meta": {"version": 1, "ok": True},
"ids": [1, 2, 3, 4, 5],
"items": [{"id": 1, "name": "alpha"}, {"id": 2, "name": "beta"}],
}
# compact can be: default, low, med, high, max
jsonfold.dump(data, sys.stdout, compact="default")
GitHub 프로젝트
저장소: https://github.com/yairlenga/jsonfold
파이썬 구현은 아래에 있습니다python 디렉토리.
다른 구현은 JavaScript, Java, C, ...에 대한 기사를 다룰 예정입니다 - GitHub 프로젝트를 주시하거나 Medium에서 기사를 구독하세요.












