API 나 로그 파일에서 나오는 원시 JSON 은 종종 한 줄로 이어져 있습니다 —— 유효하지만 한눈에 읽을 수 없습니다. JSON 포매팅("pretty-print" 또는 "beautify" 라고도 함)은 일관된 들여쓰기와 줄바꿈을 추가하여 구조를 즉시 알아볼 수 있게 합니다. 본 가이드는 JavaScript, Python, 명령행, 그리고 브라우저에서 JSON 파일이나 문자열을 포매팅하는 방법을 보여줍니다.
"JSON 포매팅"이란?
JSON 포매터는 압축되거나 들여쓰기가 일관되지 않은 JSON 문자열을 다음과 같이 다시 씁니다:
- 각 키-값 쌍은 자체 줄에
- 중첩된 객체와 배열은 고정된 수의 공백(보통 2 또는 4)으로 들여쓰기
- 후행 공백 없음
// 포매팅 전(minify 됨)
{"user":{"name":"Alice","age":30,"roles":["admin","editor"]}}
// 포매팅 후(2 공백 들여쓰기)
{
"user": {
"name": "Alice",
"age": 30,
"roles": [
"admin",
"editor"
]
}
}두 형태는 의미적으로 동일합니다 —— JSON 파서는 어느 쪽에서도 같은 데 이터 구조를 만듭니다. 포매팅은 순전히 사람이 읽기 위한 것입니다.
JavaScript 에서 JSON 포매팅
JSON.stringify() 는 두 번째 인자(replacer)와 세 번째 인자(들여쓰기 레벨)를 받습니다. replacer 에 null、2 를 주면 2 공백 들여쓰기(전체 API 는 How to Stringify JSON):
const obj = { user: { name: "Alice", age: 30, roles: ["admin", "editor"] } };
// 압축(포매팅 없음)
JSON.stringify(obj);
// 2 공백 들여쓰기 pretty-print
JSON.stringify(obj, null, 2);
// 4 공백 들여쓰기
JSON.stringify(obj, null, 4);
// 탭 들여쓰기
JSON.stringify(obj, null, '\t');JSON 문자열(객체가 아닌) 포매팅
이미 유효하지만 형식이 엉성한 JSON 문자열이 있다면 먼저 파싱한 다음 다시 stringify 하세요:
const raw = '{"name":"Alice","age":30}';
const formatted = JSON.stringify(JSON.parse(raw), null, 2);
console.log(formatted);키를 알파벳 순으로 정렬
포매팅 중에 객체 키를 정렬하려면 마주치는 객체마다 키를 정렬하는 replacer 함수를 넘기세요:
function sortedStringify(obj, indent = 2) {
return JSON.stringify(obj, (key, value) => {
if (value && typeof value === 'object' && !Array.isArray(value)) {
return Object.keys(value).sort().reduce((acc, k) => {
acc[k] = value[k];
return acc;
}, {});
}
return value;
}, indent);
}Python 에서 JSON 포매팅
Python 내장 json 모듈은 indent 매개변수로 포매팅을 처리합니다:
import json
# Python dict 포매팅
data = {"user": {"name": "Alice", "age": 30, "roles": ["admin", "editor"]}}
formatted = json.dumps(data, indent=2)
print(formatted)
# JSON 문자열 포매팅
raw = '{"name":"Alice","age":30}'
formatted = json.dumps(json.loads(raw), indent=2)
# 키를 알파벳 순으로 정렬
formatted = json.dumps(data, indent=2, sort_keys=True)
# JSON 파일 포매팅
with open('input.json') as f:
data = json.load(f)
with open('output.json', 'w') as f:
json.dump(data, f, indent=2)명령행에서 JSON 파일 포매팅
jq 사용(권장)
jq 는 명령행의 사실상 표준 JSON 처리기입니다. 기본으로 JSON 을 포매팅합니다:
# JSON 파일을 pretty-print
jq . input.json
# Pretty-print 한 뒤 새 파일에 저장
jq . input.json > output.json
# curl 응답을 포매팅
curl -s https://api.example.com/users | jq .
# 키 정렬
jq --sort-keys . input.jsonPython 사용(설치 불필요)
Python 이 설치된 모든 시스템에서 json.tool 모듈을 명령행 포매터로 사용할 수 있습니다:
# 파일 포매팅
python3 -m json.tool input.json
# 표준 입력에서 포매팅
echo '{"name":"Alice","age":30}' | python3 -m json.tool
# 키 정렬
python3 -m json.tool --sort-keys input.jsonNode.js 사용
node -e "const fs=require('fs'); const d=JSON.parse(fs.readFileSync('input.json')); console.log(JSON.stringify(d,null,2))"데이터를 JSON 형식으로 변환
"format to JSON" 은 종종 다른 형식(Python dict, CSV 파일, YAML 설정)의 데이터를 유효한 JSON 으로 직렬화하는 것을 의미합니다.
YAML 에서 JSON 으로
# Python
import yaml, json
with open('config.yaml') as f:
data = yaml.safe_load(f)
print(json.dumps(data, indent=2))또는 브라우저에서 YAML to JSON 변환기 를 쓰세요 —— 코드 불필요. 어떤 형식을 고를지는 JSON vs YAML 을, YAML 1.2 가 JSON 의 적절한 상위집합인 이유는 YAML 1.2 and JSON Compatibility 를 보세요.
CSV 에서 JSON 으로
import csv, json
with open('data.csv') as f:
rows = list(csv.DictReader(f))
print(json.dumps(rows, indent=2))JavaScript 객체에서
JavaScript 객체는 JSON 처럼 보이지만 JSON 이 아닙니다 —— 따옴표 없는 키, 작은따옴표 문자열, 후행 콤마, 주석을 가질 수 있습니다. 유효하지 않은 JavaScript 객체 리터럴을 JSON Fix 에 붙여 넣으면 자동으로 유효한 JSON 으로 바꿉니다.
에디터에서 JSON 포매팅(Prettier, VS Code, pre-commit)
일상 작업에서 가장 유용한 포매팅 시점은 저장 시입니다 —— 그러면 포매팅되지 않은 JSON 이 git 이나 PR 에 절대 들어가지 않습니다.
Prettier
# 설치
npm i -D prettier
# 모든 .json (및 소스) 파일을 제자리에서 포매팅
npx prettier --write "**/*.{json,jsonc}"
# 검사만(CI 친화적; 포매팅 필요 시 비영(non-zero) 종료)
npx prettier --check "**/*.json" Prettier 는 JSON 과 JSONC 를 기본 지원합니다. .prettierrc 는 { "tabWidth": 2 } 같은 두 줄이면 보통 충분합니다.
VS Code —— 저장 시 포매팅
Prettier 확장을 설치하고 작업영역 settings.json 에 추가:
{
"editor.formatOnSave": true,
"[json]": { "editor.defaultFormatter": "esbenp.prettier-vscode" },
"[jsonc]": { "editor.defaultFormatter": "esbenp.prettier-vscode" }
}Pre-commit 훅
포매팅되지 않은 JSON 이 커밋되는 것을 원천 차단하려면 lint-staged + husky 를 연결:
// package.json
{
"lint-staged": { "*.{json,jsonc}": "prettier --write" }
}
# 훅 설치
npx husky add .husky/pre-commit "npx lint-staged"JSON 포매팅 예: Before / After
// 포매팅 전 —— 유효하지만 읽기 힘듦
{"orders":[{"id":1001,"customer":{"name":"Alice"},"items":[{"sku":"A1","qty":2}]}]}
// 포매팅 후
{
"orders": [
{
"id": 1001,
"customer": { "name": "Alice" },
"items": [ { "sku": "A1", "qty": 2 } ]
}
]
}자주 묻는 질문
JavaScript 에서 JSON 을 포매팅하려면?
JSON.stringify(value, null, 2) 를 사용하세요 —— 세 번째 인자가 들여쓰기(2 공백, 4 공백, 또는 '\t' 로 탭)를 설정합니다. 기존 JSON 문자열을 포매팅하려면 먼저 파싱하세요: JSON.stringify(JSON.parse(raw), null, 2).
명령행에서 JSON 을 pretty-print 하려면?
jq . file.json(기본으로 포매팅), 또는 jq 가 설치되지 않았다면 python3 -m json.tool file.json. --sort-keys 를 추가하면 알파벳 순 정렬.
포매팅과 minify 의 차이는?
포매팅은 가독성을 위해 공백을 더하고, minify 는 크기를 줄이려 공백을 제거합니다. 정확히 반대 작업이며 둘 다 데이터를 보존합니다. 역방향은 How to Minify JSON.
JSON 포매팅이 데이터를 바꾸나요?
아니요. JSON 에서 들여쓰기와 줄바꿈은 무의미한 공백입니다 —— 모든 파서가 압축이든 pretty-print 이든 동일한 데이터 구조를 만듭니다.
JSON 을 온라인에서 포매팅 —— 설정 불필요
지금 당장 코드 없이 JSON 을 포매팅해야 한다면 JSON Fix 가 즉시 포매팅합니다. JSON 을 붙여 넣고 Format 을 누르고 결과를 복사하세요. 포매팅 전에 흔한 오류(후행 콤마, 작은따옴표, 따옴표 없는 키)도 수리하므로 JSON 이 아직 유효하지 않아도 동작합니다.
- JSON Fix —— 포매팅과 수리를 한 단계로
- How to Minify JSON —— 역방향 작업과 가치
- CSV 와 XML 을 JSON 으로 변환 —— 다른 형식을 JSON 으로
- jq 튜토리얼 —— 명령행에서 JSON 포매팅·변환
- JSON Diff —— 포매팅된 JSON 과 원본을 나란히 비교
- JSON 이란? —— 6 가지 데이터 타입과 JSON 을 엄격하게 만드는 규칙
- JSON 포맷 예제 —— 모든 데이터 타입과 실제 패턴에 대한 복사-붙여넣기 가능 예제
- YAML to JSON —— YAML 을 포매팅된 JSON 으로 변환