1. JSON(JavaScript Object Notation)이란?
JSON(발음은 “제이슨”, “zheson”이 아님!)은 JavaScript Object Notation의 약자입니다. 이름에 “JavaScript”가 들어가 있지만 JSON은 Java를 포함해 거의 모든 프로그래밍 언어가 지원하는 범용 형식입니다.
JSON은 2000년대 초 Douglas Crockford가 브라우저와 서버 사이의 데이터 교환을 단순화하기 위한 방법으로 고안했습니다. 그전에는 XML이 주류였는데 — 태그가 많고 장황했습니다.
JSON은 더 간결하고 단순하며 사람 눈으로도 읽기 쉽습니다. 웹과 모바일 앱에서 특히, 클라이언트와 서버 간 데이터 교환의 사실상 표준이 되었습니다.
왜 JSON이 표준이 되었을까?
- 문법의 단순성 — 사람이 손으로 쓰고 읽기 쉽습니다.
- 간결함 — 불필요한 태그나 “군더더기”가 없습니다.
- 가독성 — 비전공자도 어느 정도 이해할 수 있습니다.
- 파싱 용이성 — 대부분의 언어에 내장/외부 라이브러리가 있습니다.
- 언어 중립성 — Java, Python, Kotlin 등 거의 모든 언어가 지원합니다.
- REST API의 표준 — 대다수 API가 JSON을 반환합니다.
XML과의 비교
| JSON | XML | |
|---|---|---|
| 가독성 | 매우 높음 | 보통(태그가 많음) |
| 크기 | 작음(간결함) | 더 큼(부피가 큼) |
| 파싱 | 간단함 | 더 많은 수고 필요 |
| 확장성 | 중첩 지원 | 중첩 지원 |
| 엄격성 | 형식성이 낮음 | 스키마 기술 가능 |
| 인기(2020+) | 매우 높음 | 사용되지만 더 드묾 |
대부분 항목에서 JSON의 승리입니다. 그럼에도 XML은 복잡한 스키마, 엄격한 타입, XSD 기반 검증, 주석과 속성이 필요한 곳 — 예를 들어 레거시 시스템과 금융권 소프트웨어 — 에서는 여전히 유효합니다.
실무에서 은행이나 우주선 같은 초엄격한 시스템을 만들지 않는다면 JSON을 사용하세요.
2. JSON 기본 문법
JavaScript 객체나 다른 언어의 딕셔너리를 써봤다면 문법이 익숙하게 느껴질 겁니다. Java에는 직접적인 “딕셔너리” 타입이 없고, java.util의 컬렉션, 특히 Map<K, V>(대개는 HashMap<K, V>)이 그 역할을 합니다.
핵심 요소
- 객체 — { }로 감싼 “키: 값” 쌍의 집합.
- 배열 — [ ]로 감싼 값의 순서 있는 목록.
객체 예시:
{
"name": "Alice",
"age": 25
}
배열 예시:
[1, 2, 3, 4, 5]
배열을 포함한 객체 예시:
{
"students": [
"Ivan",
"Maria",
"John"
]
}
허용되는 값 타입
JSON에서 사용할 수 있는 데이터 타입은 다음뿐입니다.
| 유형 | 예 | 설명 |
|---|---|---|
| 문자열 | |
항상 큰따옴표 사용 |
| 숫자 | |
정수와 실수 |
| 불리언 | |
논리 값 |
| null | |
“비어 있음”, 값 부재 |
| 객체 | |
“키: 값” 쌍의 모음 |
| 배열 | |
값 목록 |
주의: 객체의 키는 항상 큰따옴표로 감싼 문자열입니다. 예를 들어 "name". 작은따옴표는 허용되지 않습니다.
유효한 JSON 예시
{
"id": 1,
"name": "Bob",
"active": true,
"scores": [10, 20, 30],
"profile": {
"email": "bob@example.com",
"phone": null
}
}
유효하지 않은 JSON 예시(오류)
{
name: 'Bob', // 오류: 키와 문자열은 반드시 큰따옴표여야 합니다!
age: 25,
}
3. 데이터 구조: 객체와 배열의 중첩
JSON은 깊은 중첩을 지원합니다: 객체 안의 객체, 객체 안의 배열, 배열 안의 객체 등. 일종의 마트료시카 같습니다.
복잡한 JSON 문서 예시
{
"university": "Java University",
"students": [
{
"name": "Ivan",
"age": 20,
"courses": ["Math", "Java", "English"]
},
{
"name": "Maria",
"age": 19,
"courses": ["Biology", "Java", "Art"]
}
],
"active": true
}
루트 객체에는 문자열 필드 "university", 불리언 필드 "active", 그리고 학생 객체들이 들어 있는 배열 "students"가 있습니다.
시각적 도식(블록 다이어그램)
{
"klyuch": znachenie,
"massiv": [
{ "klyuch": znachenie },
{ "klyuch": znachenie }
],
"obekt": {
"klyuch": znachenie
}
}
4. JSON의 장점
왜 JSON이 이렇게 인기 있을까?
- 사람과 기계 모두 읽기 쉬움 — 구조를 이해하기 쉽습니다.
- 간결함 — 불필요한 문자가 최소화됩니다.
- 파싱의 단순함 — 읽기/쓰기를 위한 라이브러리가 풍부합니다.
- REST API와 모바일 앱의 표준 — 광범위하게 사용됩니다.
- 유연성 — 단순 리스트부터 트리 구조까지 표현 가능합니다.
- 설정, 구성, 데이터 저장 — 구성 파일로 자주 사용됩니다.
- 모든 언어의 지원 — Java, Python, Go, Rust 등.
5. 실습: JSON 파일 예제 분석
예제 1: 사용자 목록
[
{
"id": 1,
"name": "Alice"
},
{
"id": 2,
"name": "Bob"
}
]
이것은 배열이며, 각 요소가 사용자 객체입니다.
예제 2: 애플리케이션 설정
{
"debug": true,
"maxConnections": 100,
"database": {
"host": "localhost",
"port": 5432,
"user": "admin",
"password": "qwerty"
}
}
"database"라는 중첩 객체를 가진 객체입니다. 실제 애플리케이션 설정과 매우 비슷합니다.
예제 3: JSON의 오류
{
"name": "Alice",
"age": 25,
} // 오류: 닫는 중괄호 앞에 불필요한 쉼표!
기억하세요: JSON에서는 마지막 요소 뒤에 쉼표를 찍을 수 없습니다.
예제 4: 따옴표 없는 키
{ name: "Alice", age: 25 } // 오류: 키는 큰따옴표로 감싸야 합니다!
6. 유용한 팁
표: JSON에서 가능한 것과 불가능한 것
| 가능 | 불가 |
|---|---|
|
|
|
|
|
|
|
|
|
|
JSON과 Java 객체 간 간단 비교
| Java | JSON |
|---|---|
|
숫자, true/false |
|
"문자열" |
| List<T>, 배열 | [값1, 값2, ...] |
|
{ "key": 값, ... } |
|
null |
| 필드를 가진 클래스 | { "field": 값, ... } |
예: Java 클래스와 그 JSON 표현
public class Student {
public String name;
public int age;
}
{
"name": "Alice",
"age": 20
}
7. JSON을 사용할 때 흔한 오류
오류 №1: 큰따옴표 대신 작은따옴표. JSON은 키와 문자열에 오직 큰따옴표만 허용합니다.
{ 'name': 'Alice' } // 오류!
오류 №2: 불필요한 쉼표. 마지막 요소 뒤에 쉼표를 찍을 수 없습니다.
{ "name": "Alice", } // 오류!
오류 №3: 따옴표 없는 키. 키는 항상 큰따옴표로 감싸야 합니다.
{ name: "Alice" } // 오류!
오류 №4: 앞에 0이 붙은 숫자. 이런 숫자는 허용되지 않습니다.
{ "age": 025 } // 오류!
오류 №5: undefined 사용. JSON에는 undefined가 없으니 null을 사용하세요.
{ "value": undefined } // 오류!
오류 №6: True/False를 대문자로 표기. JSON에서는 true와 false만 허용됩니다(소문자).
{ "active": True } // 오류!
GO TO FULL VERSION