이 도구는 중첩 JSON을 /user/tags/0이나 user.tags[0] 같은 경로를 키로 가진 한 단계 객체로 바꾸고, 그런 객체를 다시 중첩 JSON으로 되돌립니다. 설정을 경로 단위로 diff하거나 grep할 때, 중첩 데이터를 평평한 키-값 저장소에 넣을 때, 깊게 중첩된 설정으로 폼을 만들 때 유용합니다.
경로 형식은 두 가지입니다. JSON Pointer(RFC 6901, /a/0/b)는 /와 ~만 이스케이프하며 JSON Patch가 쓰는 형식입니다. 점 표기(a[0].b)는 코드처럼 읽히고 배열 위치를 대괄호로 쓰며, 키 안의 ., [, ], \는 역슬래시로 이스케이프합니다. 방향 옵션으로 평탄화와 복원을 바꾸고, 방향 바꾸기 버튼은 결과를 입력으로 옮기면서 방향을 뒤집어 줍니다.
키 순서와 숫자 표기가 그대로 유지되어 9007199254740993이나 1.50도 변하지 않고, 빈 객체와 배열은 자기 경로에 {}와 []로 남으며, 왕복 변환은 테스트로 검증됩니다. 처리는 브라우저 안에서만 이루어지고 서버로 전송되지 않으며 입력은 최대 20MiB입니다. 200,000자를 넘는 입력은 worker에서 처리합니다. 1,000,000자를 넘으면 입력 편집기 대신 크기와 줄 수 요약을 보여 줍니다.
사용 방법
JSON 붙여넣기 또는 파일 열기
평탄화할 중첩 문서나 복원할 경로 객체를 붙여넣습니다. 최대 20MiB 파일을 끌어다 놓거나 열 수도 있고, 예제 칩으로 시작할 수도 있습니다.
방향 선택
방향을 평탄화 또는 복원으로 고릅니다. 복원은 입력이 JSON 객체여야 합니다. 한 번 실행한 뒤 방향 바꾸기를 누르면 출력이 입력으로 옮겨지고 방향이 뒤집혀서 왕복 결과를 바로 확인할 수 있습니다.
경로 형식 선택
JSON 포인터(
/a/0/b)와 점 표기(a[0].b) 중에서 고릅니다. 복원할 때 입력의 경로도 선택한 형식과 같아야 합니다.복원 옵션 설정
포인터 형식으로 복원할 때는 숫자 키 옵션으로 키가 0, 1, 2…인 객체를 배열로 되돌릴지 객체로 둘지 정합니다. 누락된 인덱스에서 멈춤을 켜면 인덱스가 비어 있을 때 null로 채우지 않고 오류를 냅니다. 들여쓰기는 공백 2칸, 4칸, 탭입니다.
결과와 참고 메시지 확인
출력과 함께 항목 수가 표시되고, 중복 키, 숫자 키 객체, null로 채운 배열 위치가 있으면 참고 메시지가 붙습니다. 경로 오류는 문제가 된 키를 알려 줍니다.
복사 또는 다운로드
JSON을 복사하거나 방향에 따라
flat.json또는nested.json으로 내려받습니다.
작동 원리
평탄화 규칙
키가 적힌 순서대로 깊이 우선으로 순회합니다. 객체는 이스케이프한 키를, 배열은 0부터 시작하는 위치를 경로에 붙이고, 비어 있지 않은 컨테이너가 아닌 모든 값은 표기를 바꾸지 않은 채 자기 경로에 기록됩니다. 빈 객체와 빈 배열에는 잎 값이 없으므로 정보를 잃지 않도록 자기 경로에 {}나 []로 기록합니다. 루트가 스칼라이면 빈 키 하나로 나오며 예를 들어 {"": 5}가 됩니다.
포인터 형식은 키가 "0", "1"인 객체와 배열을 구별할 수 없습니다. 둘 다 /x/0, /x/1이 되기 때문입니다. 입력에 이런 객체가 있으면 객체 키를 고르지 않는 한 복원 시 배열이 된다는 참고 메시지가 나옵니다.
| 원본 | 포인터 키 | 점 표기 키 |
|---|---|---|
| user → name | /user/name | user.name |
| tags의 1번 위치 | /tags/1 | tags[1] |
| 키 a/b | /a~1b | a/b |
| 키 m~n | /m~0n | m~n |
| 키 a.b | /a.b | a\.b |
| 키 c[0] | /c[0] | c\[0\] |
| meta 자리의 빈 객체 | /meta, 값은 {} | meta, 값은 {} |
복원 규칙
포인터 키는 비어 있거나 슬래시로 시작해야 하고, ~1과 ~0은 /와 ~로 되돌립니다. 키가 모두 평범한 인덱스(0, 1, 2…, 앞자리 0 없음)인 컨테이너는 숫자 키를 배열 인덱스로 두면 배열이 되고, 객체 키로 두면 객체로 남습니다. 점 표기에서는 대괄호가 항상 배열, 이름이 항상 객체를 뜻하므로 모호함이 없어서 숫자 키 옵션이 나타나지 않습니다.
비어 있는 배열 위치는 null로 채우고 참고 메시지로 알리며, 누락된 인덱스에서 멈춤을 켜면 오류로 거부합니다. 빠진 위치가 10,000개를 넘으면 항상 거부합니다. 같은 경로가 값이면서 컨테이너인 경우(/a와 /a/b), 점 표기에서 한 컨테이너에 대괄호와 이름이 섞인 경우, 빈 키가 다른 키와 섞인 경우는 조용히 합치지 않고 충돌 오류를 냅니다. __proto__라는 키는 평범한 키일 뿐이며 객체 프로토타입을 바꾸지 못합니다.
포인터 형식과 점 표기
JSON Pointer는 교환용으로 더 안전합니다. 이스케이프할 글자가 둘뿐이고 배열 위치가 그냥 숫자이며, JSON Patch(RFC 6902)와 여러 검증기·설정 도구가 이해합니다. 점 표기는 읽기 쉽고 코드에서 필드를 가리키는 방식과 같지만, 키에 점이나 대괄호가 있으면 역슬래시 이스케이프가 필요합니다.
숫자 키를 가진 객체가 있는 데이터라면 점 표기는 정확히 왕복하고, 포인터 형식은 숫자 키 옵션으로 두 해석 중 하나를 골라야 합니다.
실제 예시
{"user":{"name":"Ada","tags":["a","b"],"meta":{},"list":[]},"price":1.50}{
"/user/name": "Ada",
"/user/tags/0": "a",
"/user/tags/1": "b",
"/user/meta": {},
"/user/list": [],
"/price": 1.50
}잎마다 JSON Pointer 경로를 키로 하는 항목이 하나씩 생깁니다. 빈 컨테이너는 {}와 []로 남고 1.50의 끝자리 0도 유지됩니다.
{"a.b":1,"c[0]":2,"rows":[{"id":1},{"id":2}]}{
"a\\.b": 1,
"c\\[0\\]": 2,
"rows[0].id": 1,
"rows[1].id": 2
}경로 형식을 점 표기로 한 결과입니다. 키 안의 점과 대괄호는 역슬래시로 이스케이프되고 배열 위치는 대괄호로 쓰입니다.
{"/user/name":"Ada","/user/tags/0":"a","/user/tags/1":"b","/n":1e2}{
"user": {
"name": "Ada",
"tags": [
"a",
"b"
]
},
"n": 1e2
}방향을 복원으로 한 결과입니다. 평범한 인덱스는 배열을, 그 밖의 세그먼트는 객체를 만들고 1e2는 적은 그대로 남습니다.
{"/0":"a","/1":"b"}{
"0": "a",
"1": "b"
}숫자 키를 객체 키로 둔 결과입니다. 기본값인 배열 인덱스로 두면 같은 입력이 ["a", "b"]가 됩니다.
{"/a/2":"x"}{
"a": [
null,
null,
"x"
]
}0번과 1번 위치가 없어서 null로 채우고 참고 메시지로 알립니다. 누락된 인덱스에서 멈춤을 켜면 이 입력은 오류가 됩니다.
{"/a":1,"/a/b":2}“/a/b”이(가) 다른 경로와 충돌합니다. 한쪽은 값으로, 다른 쪽은 컨테이너로 쓰고 있습니다./a가 값이라서 /a/b가 들어갈 자리가 없습니다. 해당 키를 알려 주며 멈춥니다.
자주 하는 실수
포인터 형식은 {"0":…}와 […]를 구별하지 못함
키가
"0","1"인 객체는 배열과 같은/0,/1로 평탄화됩니다. 복원하면 기본적으로 배열이 나오므로 객체를 되살리려면 숫자 키를 객체 키로 바꾸거나 점 표기를 쓰세요.배열 인덱스의 빈틈은 null이 됨
/a/2하나만 복원하면 앞의 두 칸이null인 길이 3의 배열이 나오고, 참고 메시지가 빠진 인덱스를 알려 줍니다. 빈틈이 내보내기 오류를 뜻한다면 누락된 인덱스에서 멈춤을 켜세요.충돌하는 경로는 오류
/a가 값이면서/a/b가 그 자식일 수는 없으므로, 한쪽을 덮어쓰지 않고 해당 키를 알려 주며 멈춥니다. 점 표기는 중첩된 빈 키를 끝의 점으로 보존하지만 루트의 빈 키는 루트 값과 구분할 수 없고 형제 경로와 섞이면 충돌합니다. 루트의 빈 키에는 JSON Pointer를 쓰세요.입력은 선택한 경로 형식과 같아야 함
포인터 형식에서
user.name키는 슬래시로 시작하지 않아 거부됩니다. 경로 형식을 점 표기로 바꾸거나/user/name으로 고치세요. 점 표기에서a[x]는 대괄호 안에 인덱스만 올 수 있어서 거부됩니다.빈 컨테이너는 자기 항목이 필요
/meta에{}나[]항목이 없는 평탄 맵을 복원하면meta키가 아예 없는 문서가 나옵니다.중복 키는 합쳐지지 않음
{"a":1,"a":2}를 평탄화하면 두 항목이 모두 기록되고 반복된 키가 참고 메시지에 나옵니다. 출력을 읽는 쪽은 마지막 값을 씁니다. 같은 경로가 반복된 평탄 맵을 복원하면 마지막 값이 남습니다.
자주 묻는 질문
평탄화된 키는 어떤 형식인가요?
RFC 6901 JSON Pointer(맨 앞 슬래시, 숫자 배열 위치, 물결표와 슬래시는 ~0, ~1) 또는 a[0].b 같은 점 표기입니다. 점 표기에서는 키 안의 ., [, ], \를 역슬래시로 이스케이프합니다. 경로 형식 옵션으로 고릅니다.
평탄화 결과에 {}와 []가 보이는 이유는?
빈 객체와 빈 배열입니다. 잎 값이 없으므로 자기 경로에 값으로 기록해 두어야 복원할 때 되살릴 수 있습니다.
a.b.c 같은 점 표기 키도 복원할 수 있나요?
네. 경로 형식을 점 표기로 바꾸면 됩니다. 포인터 형식에서는 슬래시로 시작하지 않아 경로 오류가 납니다.
배열과 객체는 어떻게 구분하나요?
점 표기에서는 대괄호가 배열, 이름이 객체입니다. 포인터 형식에서는 키가 모두 평범한 인덱스인 컨테이너를 배열로 만들며, 숫자 키를 객체 키로 바꾸면 객체로 남습니다.
평탄화는 되돌릴 수 있나요?
중첩 데이터, 빈 컨테이너, 슬래시·점·대괄호·물결표가 든 키, 배열의 배열은 되돌릴 수 있으며 테스트로 확인합니다. 예외는 포인터 형식에서 숫자 키를 가진 객체로, 객체 키를 골라야 객체로 돌아옵니다.
키 순서와 숫자 표기는 유지되나요?
네. 키는 나타난 순서대로 기록되고 숫자는 적은 그대로 복사되므로 1.50이나 9007199254740993도 바뀌지 않습니다.
__proto__ 키는 어떻게 되나요?
다른 키와 똑같이 취급됩니다. 출력에는 평범한 __proto__ 항목이 생기고 객체 프로토타입은 건드리지 않습니다.
데이터가 업로드되나요? 크기 제한은요?
업로드되지 않으며 변환은 브라우저 안에서 이루어집니다. 입력은 최대 20MiB이고 항목 수 표시로 결과에 평탄 키가 몇 개인지 확인할 수 있습니다.
더 깊이 읽기
마지막 업데이트:
