RFC 8259 · ECMA-404

JSON
이론과 구조

JavaScript Object Notation — 사람이 읽고 쓰기 쉬우면서 기계가 파싱하기 쉬운 경량 데이터 교환 포맷의 모든 것

01 / 08

JSON의 역사

JSON은 특정 시점에 발명된 것이 아니라 발견되었습니다. Douglas Crockford는 2001년 JavaScript의 객체 리터럴 표기법이 이미 훌륭한 데이터 포맷임을 인식하고 이를 공식화했습니다.

1999
JavaScript 1.2에서 객체 리터럴 문법이 정착됩니다. eval()로 파싱 가능한 표기법이 이미 존재했습니다.
2001
Douglas Crockford와 Chip Morningstar가 State Software 프로젝트에서 JSON을 처음 실용화합니다. 명칭은 json.org 도메인과 함께 공개됩니다.
2006
첫 번째 공식 표준 RFC 4627 발행. MIME 타입 application/json이 등록됩니다.
2013
ECMA-404로 ISO 표준화됩니다. 같은 해 JSON.parse()가 모든 주요 브라우저에서 지원됩니다.
2017
개정판 RFC 8259 발행. UTF-8 인코딩이 유일한 표준으로 확정되며 BOM 사용이 금지됩니다.
현재
REST API, 설정 파일, NoSQL 데이터베이스, 메시지 큐 등 가장 널리 쓰이는 데이터 교환 포맷이 되었습니다.
02 / 08

문법 구조

JSON은 두 가지 구조만으로 이루어집니다. 객체(Object)배열(Array)입니다. 이 두 구조는 재귀적으로 중첩 가능합니다.

완전한 JSON 예시 application/json
{
  "name": "김철수",
  "age":  28,
  "isActive": true,
  "score":  98.5,
  "nickname": null,
  "tags":   ["개발자", "서울"],
  "address": {
    "city":   "서울특별시",
    "zip":    "04524"
  }
}

Object 문법

중괄호 { }로 감싸며, "키"을 콜론으로 연결합니다. 쌍은 쉼표로 구분합니다. 키는 반드시 큰따옴표로 감싼 문자열이어야 합니다.

Object 구조
{  ← 시작
  "key1" : value1 ,   ← 쌍1
  "key2" : value2      ← 쌍N (마지막 쉼표 금지)
}  ← 종료

Array 문법

대괄호 [ ]로 감싸며, 값들을 쉼표로 구분합니다. 배열 안에 다른 타입이 혼재할 수 있지만, 실무에서는 동일 타입을 사용합니다.

Array 구조
[  ← 시작
  value1,    ← 요소1
  value2,    ← 요소2
  { "nested": true }  ← 중첩 객체도 OK
]  ← 종료
03 / 08

6가지 데이터 타입

JSON은 딱 여섯 가지 타입만 지원합니다. 날짜, 함수, undefined 같은 타입은 존재하지 않습니다.

string
문자열

큰따옴표로 감싼 유니코드 문자 시퀀스. 작은따옴표 사용 불가.

"안녕하세요"
"Hello\nWorld"
"탭\t포함"
number
숫자

정수·실수 모두 포함. 8진수·16진수·NaN·Infinity 미지원.

42
-3.14
6.022e23
boolean
불리언

소문자로만 표기. True·TRUE·1은 모두 오류.

true
false
null

값의 부재를 의미. undefined와 다름. 소문자만 허용.

null
object
객체

키-값 쌍의 컬렉션. 키는 반드시 문자열. 순서 미보장.

{ "x": 1 }
array
배열

순서 있는 값의 컬렉션. 인덱스 0부터 시작. 혼합 타입 가능.

[1, "a", true]

이스케이프 시퀀스

문자열 내에서 특수 문자를 표현할 때 백슬래시를 사용합니다.

이스케이프 문자
"\""   ← 큰따옴표
"\\"   ← 백슬래시
"\n"   ← 줄바꿈 (LF)
"\r"   ← 캐리지 리턴
"\t"   ← 탭
"\uAC00" ← 가 (유니코드 코드포인트)
04 / 08

인터랙티브 파서

JSON을 입력하면 실시간으로 파싱하여 트리 구조로 시각화합니다.

입력 0 bytes
✓ 유효한 JSON
트리 뷰 0 노드
05 / 08

자주 틀리는 규칙

항목올바른 예틀린 예설명
키 따옴표 "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과 다릅니다.

06 / 08

JSON Schema

JSON Schema는 JSON 데이터의 구조를 JSON으로 기술하는 메타 포맷입니다. 데이터 검증, 문서화, 코드 생성에 사용됩니다.

JSON Schema 예시Draft 2020-12
{
  "$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전체허용 타입 지정. 배열로 복수 지정 가능
requiredobject필수 키 목록
propertiesobject각 키의 스키마 정의
itemsarray배열 요소의 스키마
minimum / maximumnumber숫자 범위 제한
minLength / maxLengthstring문자열 길이 제한
patternstring정규식 패턴 검증
enum전체허용 값 열거
$ref전체다른 스키마 참조 (재사용)
07 / 08

다른 포맷과 비교

JSON vs XML

JSON
{
  "user": {
    "name": "김철수",
    "age": 28,
    "tags": ["dev", "seoul"]
  }
}
XML
<user>
  <name>김철수</name>
  <age>28</age>
  <tags>
    <tag>dev</tag>
    <tag>seoul</tag>
  </tags>
</user>

JSON은 XML보다 가독성이 높고 용량이 작습니다. XML은 속성(attribute), 네임스페이스, DTD 같은 복잡한 기능이 있지만 파싱이 무겁습니다.

JSON vs YAML

JSON
{
  "name": "service",
  "port": 8080,
  "debug": false,
  "hosts": ["a", "b"]
}
YAML
name: service
port: 8080
debug: false
hosts:
  - a
  - b

YAML은 사람이 읽기 더 편하고 주석을 지원합니다. 단, 들여쓰기 민감도, 암시적 타입 변환 등으로 파싱 오류가 발생하기 쉽습니다. JSON은 YAML의 subset(거의)입니다.

JSON vs Protocol Buffers

Protocol Buffers(protobuf)는 구글이 개발한 이진 직렬화 포맷입니다. JSON보다 3~10배 작고 파싱이 빠르지만, 스키마(.proto)가 필요하고 사람이 읽을 수 없습니다. 고성능 내부 API에 적합합니다.

08 / 08

JSON의 실용적 활용

🌐
REST API
웹 API의 요청·응답 본문으로 가장 널리 사용됩니다. Content-Type: application/json이 사실상 표준입니다.
⚙️
설정 파일
package.json, tsconfig.json, .eslintrc 등 개발 도구의 설정 파일 형식으로 광범위하게 사용됩니다.
🗄️
NoSQL 데이터베이스
MongoDB, CouchDB, DynamoDB는 JSON(또는 BSON) 문서를 기본 저장 단위로 사용합니다.
📦
직렬화 / 역직렬화
메모리의 객체 상태를 JSON 문자열로 저장하거나, 반대로 복원하는 데 사용됩니다. 세션 저장, 캐싱 등에 활용됩니다.
🔗
JWT (JSON Web Token)
Header·Payload가 JSON 객체로 이루어진 인증 토큰 표준. Base64URL로 인코딩되어 전달됩니다.
📊
GeoJSON / JSON-LD
지리 정보를 담는 GeoJSON, 시맨틱 웹을 위한 JSON-LD처럼 도메인 특화 JSON 파생 포맷이 다양하게 존재합니다.

JSON의 한계 — 날짜·시간 타입 없음(ISO 8601 문자열 관례 사용), 이진 데이터 없음(Base64 인코딩 관례), 주석 없음, 중복 키 동작 미정의, 숫자 정밀도 손실(64비트 정수 한계).