1. 소개
만약 현대적인 API를 열어봤거나, web 서비스나 모바일 앱을 다뤄봤거나, 심지어 뭔가를 "범용 포맷"으로 저장하려고 한 적이 있다면 — 이미 JSON을 접했거나 곧 접하게 될 거야. 이 포맷은 서로 다른 프로그래밍 언어와 플랫폼을 문자 그대로 "연결"해줘: C#, JavaScript, Python — 모두 JSON으로 얘기해.
왜 JSON이 직렬화의 스타가 되었을까? 답은 간단해: 간결하고, 사람이 읽기 쉬우며, 가벼운 텍스트 기반 데이터 교환 포맷이기 때문이지. 그 인기는 단순함, 범용성, 그리고 각 언어에서의 훌륭한 지원이 잘 어우러진 결과야.
JSON이란?
JSON은 JavaScript Object Notation의 약자야. 이 포맷은 JavaScript 세계에서 나왔지만 금방 브라우저를 벗어나 더 넓은 세계로 퍼졌어. 중요 포인트: 이름의 기원에도 불구하고 JSON은 JavaScript에 종속적이지 않고 모든 프로그래밍 언어에서 똑같이 편하게 쓸 수 있어.
이 포맷은 2000년대 초에 Douglas Crockford가 XML보다 더 간단한 대안으로 고안했어. 아이디어는 단순해: "JSON은 더 짧고, 더 간단하고, 눈으로 보기에 더 쉽다".
2. JSON 포맷의 기본 규칙
핵심: JSON은 구조화된 데이터를 위한 엄격하게 정의된 텍스트 포맷이야. 마법 같은 건 없고, 그냥 아무 에디터로 열 수 있는 일반 텍스트라고 생각하면 돼.
기본 구성 요소:
- 배열 (arrays): 값을 순서대로 나열한 리스트.
- 객체 (objects): 키-값 쌍들의 집합.
- 원시 타입: 문자열, 숫자, 불리언 값 (true, false) 그리고 특수값 null.
최소 JSON 문서 예제:
{
"name": "이반",
"age": 25,
"isStudent": true,
"scores": [5, 4, 5, 3],
"contacts": {
"email": "ivan@example.com",
"phone": null
}
}
개략적인 구조
아래는 C# 타입과 JSON 표현의 간단한 대응표야:
| C# 타입 | JSON 예제 |
|---|---|
|
|
|
|
|
|
| 배열 (int[], ...) | |
| 객체 (class, ...) | |
|
|
JSON 작성 규칙
- 문자열은 항상 큰따옴표: 'text' — 오류, 올바른 표기는 "text".
- 객체의 키는 큰따옴표로 된 문자열: 예를 들어 "name": ...
- 요소들 사이에만 콤마, 마지막 요소 뒤에 붙는 트레일링 콤마는 없음.
- 들여쓰기는 필수는 아니지만 가독성을 위해 권장.
- 숫자는 따옴표 없이: "age": 25, 숫자를 문자열로 쓰지 마라 ("age": "25"는 다름).
- 불리언은 true/false (따옴표 없음), True, FALSE 또는 "true" 같은 표기는 허용되지 않아.
- null은 따옴표 없이 null로 적는다.
3. 프로그래머 관점에서 본 JSON
C# 타입과의 유사성:
- JSON 객체 ≈ Dictionary<string, object>
- JSON 배열 ≈ T[] 또는 List<T>
- JSON 문자열 ≈ 일반 string
- JSON 숫자 ≈ int 또는 double (값에 따라)
객체를 JSON으로 직렬화하는 예제
클래스:
public class Student
{
public string Name { get; set; } = "";
public int Age { get; set; }
public bool IsStudent { get; set; }
public int[] Scores { get; set; } = Array.Empty<int>();
}
생성되는 JSON (단순화했음, 직렬화 세부는 뒤에서):
{
"Name": "이반",
"Age": 25,
"IsStudent": true,
"Scores": [5, 4, 5, 3]
}
4. 허용되는 JSON 구조 예제
배열과 중첩 객체를 가진 객체
{
"product": "커피",
"price": 125.50,
"inStock": true,
"attributes": {
"weight": 500,
"unit": "그"
},
"tags": ["음료", "에너지", "아라비카"],
"promotions": null
}
객체들의 배열
[
{"id": 1, "name": "페트야"},
{"id": 2, "name": "마샤"},
{"id": 3, "name": "바샤"}
]
5. 허용되지 않는 JSON 예제 (그리고 이유)
작은따옴표 사용:
{ 'name': '이반' } // 오류!
JSON은 큰따옴표만 허용해.
마지막 요소 뒤의 콤마:
{ "x": 1, "y": 2, } // 오류!
끝에 여분의 콤마는 허용되지 않아.
주석:
{
// 이런 짓은 안타깝게도 JSON에서 동작하지 않아
"name": "이반"
}
JSON에는 주석이 없어.
6. 실제 프로젝트에서 JSON이 왜 필요한가?
시스템 간 데이터 전달
JSON은 다른 프로그램들 사이의 범용 "공용 언어"야, 보통은 HTTP 위에서 쓰이지. 예를 들어, 서버가 C#로 되어 있고 프론트엔드가 JavaScript라면 — 공용 포맷은 JSON이지.
설정과 데이터 저장
많은 애플리케이션이 설정을 .json 파일에 저장해. 예를 들면, appsettings.json — .NET 앱의 표준이야. 장점: 읽고 수정하기 쉽고 버전 관리하기 편해.
서버 및 모바일 API
대부분의 REST API는 요청과 응답 포맷으로 JSON을 사용해: 예를 들어, 사용자 목록은 객체들의 배열로 넘어와.
도구와 라이브러리 구성
많은 .NET 도구들(Serilog, Swagger 등)은 설정에 JSON을 사용해. XML은 점점 덜 보이는데 — JSON이 더 간결하고 이해하기 쉬워서야.
7. JSON의 인기: 사람들이 좋아하는 이유
- 가독성. 비개발자도 대체로 구조를 이해할 수 있어.
- 네트워크 전송에 편리함. 일반 텍스트라서 용량 부담이 적어.
- 모든 언어의 지원. 직렬화/역직렬화 기능이 대부분 기본 제공되거나 쉽게 사용 가능해.
- 설정 파일로 편리. 어떤 에디터든 잘 다루지.
- 생성하기 쉬움. JSON을 만들어내는 건 아주 간단해.
- 배열, 중첩, null. 직관적이고 XML처럼 괄호 지옥에 빠지지 않아.
언제 JSON을 선택할까?
- 모바일이나 웹 애플리케이션을 만든다면;
- 외부 서비스의 API와 연동한다면;
- 미래 통합에 친화적인 앱을 만들고 싶다면.
8. C#에서 JSON 다루기
간단히 .NET에서 인기 있는 라이브러리들:
- System.Text.Json — 표준, 빠르고 단순해.
- Newtonsoft.Json (Json.NET) — 기능이 풍부한 '베테랑'.
최소한의 직렬화/역직렬화 예제:
using System.Text.Json;
// 객체를 JSON 문자열로 변환
var student = new Student { Name = "이반", Age = 25, IsStudent = true, Scores = new[] {5, 4, 5, 3} };
string json = JsonSerializer.Serialize(student);
// 반대로: JSON 문자열에서 객체 읽기
Student? parsed = JsonSerializer.Deserialize<Student>(json);
Console.WriteLine(json);
9. JSON 작업 시 초보자들이 흔히 하는 실수
자주 하는 실수는 따옴표를 헷갈리거나 콤마를 빼먹는 것 같아. 가끔 주석을 추가하려고(C#처럼 — 편하니까!) 하는데 JSON은 그걸 허용하지 않아.
또 다른 흔한 상황은 초기화되지 않은 컬렉션을 직렬화해서 기대하던 배열 대신에 "scores": null이 나오는 경우야. 컬렉션은 미리 초기화해 놔.
JSON은 텍스트라는 걸 잊지 마. 데이터가 많으면 메모리와 성능에 큰 영향을 줄 수 있어. 예를 들어 조건상 500MB를 JSON으로 직렬화하면 애플리케이션 성능이 눈에 띄게 떨어질 수 있어.
GO TO FULL VERSION