JavaScript Object Notation — 사람이 읽고 쓰기 쉬우면서 기계가 파싱하기 쉬운 경량 데이터 교환 포맷의 모든 것
JSON은 특정 시점에 발명된 것이 아니라 발견되었습니다. Douglas Crockford는 2001년 JavaScript의 객체 리터럴 표기법이 이미 훌륭한 데이터 포맷임을 인식하고 이를 공식화했습니다.
eval()로 파싱 가능한 표기법이 이미 존재했습니다.json.org 도메인과 함께 공개됩니다.application/json이 등록됩니다.JSON.parse()가 모든 주요 브라우저에서 지원됩니다.JSON은 두 가지 구조만으로 이루어집니다. 객체(Object)와 배열(Array)입니다. 이 두 구조는 재귀적으로 중첩 가능합니다.
{
"name": "김철수",
"age": 28,
"isActive": true,
"score": 98.5,
"nickname": null,
"tags": ["개발자", "서울"],
"address": {
"city": "서울특별시",
"zip": "04524"
}
}
중괄호 { }로 감싸며, "키"와 값을 콜론으로 연결합니다. 쌍은 쉼표로 구분합니다. 키는 반드시 큰따옴표로 감싼 문자열이어야 합니다.
{ ← 시작 "key1" : value1 , ← 쌍1 "key2" : value2 ← 쌍N (마지막 쉼표 금지) } ← 종료
대괄호 [ ]로 감싸며, 값들을 쉼표로 구분합니다. 배열 안에 다른 타입이 혼재할 수 있지만, 실무에서는 동일 타입을 사용합니다.
[ ← 시작 value1, ← 요소1 value2, ← 요소2 { "nested": true } ← 중첩 객체도 OK ] ← 종료
JSON은 딱 여섯 가지 타입만 지원합니다. 날짜, 함수, undefined 같은 타입은 존재하지 않습니다.
큰따옴표로 감싼 유니코드 문자 시퀀스. 작은따옴표 사용 불가.
정수·실수 모두 포함. 8진수·16진수·NaN·Infinity 미지원.
소문자로만 표기. True·TRUE·1은 모두 오류.
값의 부재를 의미. undefined와 다름. 소문자만 허용.
키-값 쌍의 컬렉션. 키는 반드시 문자열. 순서 미보장.
순서 있는 값의 컬렉션. 인덱스 0부터 시작. 혼합 타입 가능.
문자열 내에서 특수 문자를 표현할 때 백슬래시를 사용합니다.
"\"" ← 큰따옴표 "\\" ← 백슬래시 "\n" ← 줄바꿈 (LF) "\r" ← 캐리지 리턴 "\t" ← 탭 "\uAC00" ← 가 (유니코드 코드포인트)
JSON을 입력하면 실시간으로 파싱하여 트리 구조로 시각화합니다.
| 항목 | 올바른 예 | 틀린 예 | 설명 |
|---|---|---|---|
| 키 따옴표 | "name": 1 | name: 1 | 키는 반드시 큰따옴표. 작은따옴표·무따옴표 불가 |
| 문자열 따옴표 | "hello" | 'hello' | 값 문자열도 반드시 큰따옴표 |
| 후행 쉼표 | {"a":1, "b":2} | {"a":1, "b":2,} | 마지막 요소 뒤 쉼표 금지 (Trailing Comma) |
| 주석 | - | // 주석 불가 /* 불가 */ |
JSON에는 주석이 없음. JSONC(주석 허용 변형) 사용 |
| 불리언·널 | true, null | True, NULL, TRUE | 반드시 소문자 |
| 숫자 형식 | 42, -3.14, 1e5 | 0x1F, 042, NaN, Infinity | 16진수·8진수·NaN·무한대 미지원 |
| 최상위 값 | 객체, 배열, 문자열, 숫자… | — | RFC 8259: 모든 JSON 값이 최상위 가능 (RFC 4627은 객체·배열만) |
JSONC란? — VSCode 설정 파일(settings.json)처럼 주석과 후행 쉼표가 허용되는 JSON 변형입니다. 표준 JSON 파서로는 파싱 불가합니다.
RFC 8259는 UTF-8을 유일한 표준 인코딩으로 지정합니다. BOM(Byte Order Mark) 사용도 금지됩니다. 네트워크 전송 시 UTF-16·32도 허용했던 RFC 4627과 다릅니다.
JSON Schema는 JSON 데이터의 구조를 JSON으로 기술하는 메타 포맷입니다. 데이터 검증, 문서화, 코드 생성에 사용됩니다.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"required": ["name", "age"],
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 50
},
"age": {
"type": "integer",
"minimum": 0,
"maximum": 150
},
"email": {
"type": "string",
"format": "email"
}
},
"additionalProperties": false
}
| 키워드 | 적용 타입 | 설명 |
|---|---|---|
| type | 전체 | 허용 타입 지정. 배열로 복수 지정 가능 |
| required | object | 필수 키 목록 |
| properties | object | 각 키의 스키마 정의 |
| items | array | 배열 요소의 스키마 |
| minimum / maximum | number | 숫자 범위 제한 |
| minLength / maxLength | string | 문자열 길이 제한 |
| pattern | string | 정규식 패턴 검증 |
| enum | 전체 | 허용 값 열거 |
| $ref | 전체 | 다른 스키마 참조 (재사용) |
{
"user": {
"name": "김철수",
"age": 28,
"tags": ["dev", "seoul"]
}
}
<user>
<name>김철수</name>
<age>28</age>
<tags>
<tag>dev</tag>
<tag>seoul</tag>
</tags>
</user>
JSON은 XML보다 가독성이 높고 용량이 작습니다. XML은 속성(attribute), 네임스페이스, DTD 같은 복잡한 기능이 있지만 파싱이 무겁습니다.
{
"name": "service",
"port": 8080,
"debug": false,
"hosts": ["a", "b"]
}
name: service port: 8080 debug: false hosts: - a - b
YAML은 사람이 읽기 더 편하고 주석을 지원합니다. 단, 들여쓰기 민감도, 암시적 타입 변환 등으로 파싱 오류가 발생하기 쉽습니다. JSON은 YAML의 subset(거의)입니다.
Protocol Buffers(protobuf)는 구글이 개발한 이진 직렬화 포맷입니다. JSON보다 3~10배 작고 파싱이 빠르지만, 스키마(.proto)가 필요하고 사람이 읽을 수 없습니다. 고성능 내부 API에 적합합니다.
Content-Type: application/json이 사실상 표준입니다.package.json, tsconfig.json, .eslintrc 등 개발 도구의 설정 파일 형식으로 광범위하게 사용됩니다.JSON의 한계 — 날짜·시간 타입 없음(ISO 8601 문자열 관례 사용), 이진 데이터 없음(Base64 인코딩 관례), 주석 없음, 중복 키 동작 미정의, 숫자 정밀도 손실(64비트 정수 한계).