Intro

파이썬에서 json 형태의 자료를 읽고 쓰는 경우는 정말 많습니다.
특히나 데이터를 분석하거나, API 통신을 통해 데이터를 주고받을 경우에는 더더욱 그렇죠.

오늘은 파이썬에서 json 형태의 자료들을 다루는 방법에 대해 알아보겠습니다.



JSON

JSON이란 속성-값 쌍, 배열 자료형 또는 기타 모든 시리얼화 가능한 값 또는 키-값 쌍으로 이루어진 데이터 오브젝트를 표현하는 포맷입니다.
설명으로는 너무 어려우니 예시를 하나 들어보겠습니다.

학생들의 이름, 점수, 교우관계 데이터를 각각 가지고있다고 생각해봅시다.

1
2
3
4
5
6
7
8
name_list = ["김철수", "박철수", "이철수", "황철수", "남궁철수"]
math_score = [98, 100, 58, 65, 78]
korean_score = [45, 78, 66, 45, 89]
gyowoo = {"김철수" : "원만하고 좋은 관계",
          "박철수" : "삼각형만하고 좋은 관계",
          "이철수" : "사격형만하고 좋은 관계",
          "황철수" : "오각형만하고 좋은 관계",
          "남궁철수" : "육각형만하고 좋은 관계"}

이 자료들에는 이름이나 점수와 같이 리스트(배열) 형태의 자료도 있고,
교우관계와 같이 키-값 쌍으로 이루어진 데이터도 있습니다.

이 자료들을 하나로 묶을 수 있을까요?
JSON 형태로 하나로 묶으면 아래와 같이 됩니다.

1
2
3
4
5
6
7
8
9
10
{'성적': {'0': {'이름': '김철수', '수학': 98, '국어': 45},
         '1': {'이름': '박철수', '수학': 100, '국어': 78},
         '2': {'이름': '이철수', '수학': 58, '국어': 66},
         '3': {'이름': '황철수', '수학': 65, '국어': 45},
         '4': {'이름': '남궁철수', '수학': 78, '국어': 89}},
 '김철수': '원만하고 좋은 관계',
 '박철수': '삼각형만하고 좋은 관계',
 '이철수': '사격형만하고 좋은 관계',
 '황철수': '오각형만하고 좋은 관계',
 '남궁철수': '육각형만하고 좋은 관계'}

JSON viewer 를 통해 이를 좀 더 시각적으로 잘 이해할 수 있게 만들어보겠습니다.

리스트 형태의 데이터 뿐만 아니라 dict 형태의 데이터도 JSON은 포함하고 있죠.
이번에는 String과 Int 값만을 사용했지만, 사실 JSON에 담길 수 있는 자료형에는 제한이 없습니다.



파이썬에서 JSON 다루기

JSON 으로 저장

그렇다면 위 자료를 JSON 파일로 만들어보도록 하겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import json

data = {'성적': {'0': {'이름': '김철수', '수학': 98, '국어': 45},
                '1': {'이름': '박철수', '수학': 100, '국어': 78},
                '2': {'이름': '이철수', '수학': 58, '국어': 66},
                '3': {'이름': '황철수', '수학': 65, '국어': 45},
                '4': {'이름': '남궁철수', '수학': 78, '국어': 89}},
        '김철수': '원만하고 좋은 관계',
        '박철수': '삼각형만하고 좋은 관계',
        '이철수': '사격형만하고 좋은 관계',
        '황철수': '오각형만하고 좋은 관계',
        '남궁철수': '육각형만하고 좋은 관계'}

path = "./data.json"

with open(path, "w") as f:
    json.dump(data, f)

JSON 파일 읽어오기

위에서 만든 JSON 파일을 읽어와보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import json

path = "./data.json"

with open(path, "r") as f:
    new_data = json.load(f)

print(data)

>>> {'성적':
>>> {
>>> '0': {'이름': '김철수', '수학': 98, '국어': 45},
>>> '1': {'이름': '박철수', '수학': 100, '국어': 78},
>>> '2': {'이름': '이철수', '수학': 58, '국어': 66},
>>> '3': {'이름': '황철수', '수학': 65, '국어': 45},
>>> '4': {'이름': '남궁철수', '수학': 78, '국어': 89}
>>> },
>>> '김철수': '원만하고 좋은 관계',
>>> '박철수': '삼각형만하고 좋은 관계',
>>> '이철수': '사격형만하고 좋은 관계',
>>> '황철수': '오각형만하고 좋은 관계',
>>> '남궁철수': '육각형만하고 좋은 관계'
>>> }

encoding

파일을 읽어올 때 특정 문자를 읽어들여오지 못하는 디코딩 에러가 발생할 때가 있습니다.
이런 경우 open 메서드에서 encoding 옵션을 주면 됩니다.

1
2
3
4
5
6
7
8
import json

path = "./data.json"

with open(path, "r", encoding="cp949") as f:
    new_data = json.load(f)

# cp949, UTF8 등



Reference

JSON이란 : https://ko.wikipedia.org/wiki/JSON
JSON 라이브러리 : https://nerogarret.tistory.com/71
디코딩 에러 : https://young-cow.tistory.com/23
JSON viewer : https://jsonviewer.stack.hu/