83.0 실전 예제: JSON 파일 읽고 쓰기

요즘은 데이터를 저장하거나 주고 받을 때 JSON 형식을 자주 사용합니다. JSON은 JavaScript Object Notation의 약자인데 JavaScript 언어의 자료형을 텍스트로 표현한 포맷입니다. 크게 키-값 쌍으로 이루어져 있으며 사람이 쉽게 읽을 수 있도록 구성되어 있습니다.

JSON이 JavaScript에서 유래되었긴 하지만 플랫폼이나 프로그래밍 언어에 독립적이라 어디서든 사용할 수 있습니다. 즉, 서로 다른 시스템간에 데이터를 교환하기에 좋고, 언어가 다르더라도 데이터를 교환하는데 문제가 없습니다.

보통 웹 서버와 웹 브라우저간의 통신에 사용하는데 스마트폰의 택배 조회 정보나, 실시간 버스 위치 정보도 간단하게 JSON으로 주고 받습니다. 게다가 모바일 게임의 데이터를 JSON으로 저장하거나 데이터베이스에서 JSON을 직접 지원하고, 빅 데이터와 머신 러닝에 JSON을 사용하는 등 다양한 분야에서 활용되고 있습니다.

먼저 JSON은 객체(object)를 { } (중괄호)로 표현합니다.

{ }

그리고 모든 데이터는 키와 값으로 표현합니다. 단, 키는 " " (큰따옴표)로 묶은 문자열을 사용해야 합니다.

{
    "키": 
}

여기서 키의 이름은 상황에 맞게 원하는대로 지으면 되는데 보통 프로그램에서 원활하게 처리하기 위해 영문을 사용합니다. 또한, JSON은 대소문자를 구분하므로 "name""Name"은 다른 키입니다.

{
    "name": "홍길동"
}

키와 값을 여러 개 쓰고 싶을 때는 , (콤마)로 구분합니다.

{
    "name": "홍길동",
    "age": 30,
    "address": "서울시 용산구 한남동"
}

값에는 문자열을 비롯하여 정수, 실수, 불 값(true, false)을 사용할 수 있습니다.

{
    "age": 30,
    "weight": 68.2,
    "marriage": false
}

첫 번째 규칙 기억하나요? 객체는 { }로 표현하는데 객체 안에서 객체를 표현할 때도 { }를 쓰면 됩니다.

{
    "dateOfBirth": {
        "year": 1980,
        "month": 10,
        "date": 21
    }
}

배열을 사용할 때는 [ ] (대괄호)를 쓰면 됩니다.

{
    "dayOfWeek": [
        "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
    ],
    "day": [
        1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 
        21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31
    ]
}

배열 안에는 값뿐만 아니라 객체를 넣을 수 있습니다.

{
    "dayOfWeek": [
        { "Sunday": 0 }, { "Monday": 1 }, { "Tuesday": 2 }, { "Wednesday": 3 },
        { "Thursday": 4 }, { "Friday": 5 }, { "Saturday": 6 }
    ]
}

JSON 문서의 내용이 모두 영문이라면 상관이 없지만 한글이나 기타 다른 나라의 언어가 들어갈 때는 반드시 파일을 UTF-8 인코딩으로 저장해야 합니다(UTF-8 인코딩은 Visual Studio에서 파일(F) > 고급 저장 옵션(V)... > 인코딩(E)에서 유니코드(서명 없는 UTF-8) - 코드 페이지 65001을 선택하면 됩니다).

참고로 이번 예제는 코드가 길고 반복되는 부분이 많습니다. 특히 문자열 함수, 문자열의 인덱스, 포인터 연산을 활용하는 방법을 눈여겨 보는 것이 좋습니다.