제목:

파이썬으로 JSON 파싱하기

날짜: Posted on

이 포스트에서는 파이썬에서 JSON 데이터를 읽어들이는 방법을 설명합니다.

이전의 파이썬으로 JSON 파일 만들기 포스트에서 예제로 다음과 같은 내용의 JSON 문서를 만들었을 것입니다.

{
	"name": "여자친구",
	"members": [
		"소원",
		"예린",
		"은하",
		"유주",
		"신비",
		"엄지"
	],
	"albums": {
		"EP 1집": "Season of Glass",
		"EP 2집": "Flower Bud",
		"EP 3집": "Snowflake",
		"정규 1집": "LOL",
		"EP 4집": "THE AWAKENING"
	}
}

이제 이 데이터를 읽기 위한 코드를 예비적으로 작성해 봅시다.

import json
from collections import OrderedDict
from pprint import pprint

with open('gfriend.json', encoding="utf-8") as data_file:    
	data = json.load(data_file, object_pairs_hook=OrderedDict)

pprint(data)

파이썬으로 JSON 만들기와 마찬가지로 json 모듈과 OrderedDict 함수를 불러옵니다. 그리고 추가적으로 모양을 가지런하게 출력하게 하기 위한 pprint 함수도 불러옵니다.

5번 줄에서 JSON 파일을 UTF-8 형식으로 불러오고 6번 줄에서 이를 JSON 형식으로 받습니다. 추가적인 옵션으로 object_pairs_hook=OrderedDict 옵션을 부여합니다. 그냥 불러올 경우 키의 자동정렬로 인하여 데이터의 순서가 맞지 않게 될 수 있기 때문입니다. 이 예제의 경우 albums를 보면 “정규 1집”이 “EP 4집”보다 먼저지만 그냥 불러올 경우 키의 자동정렬 때문에 “정규 1집”이 “EP 4집”보다 뒤로 가게 됩니다. 물론 데이터의 순서가 바뀌어도 상관없다면 굳이 OrderedDict 옵션을 주지 않아도 되지만 순서가 중요하다면 이 옵션이 필요합니다.

이제 8번 줄에서 pprint 함수를 통해 불러온 데이터를 여러 줄에 걸쳐 가지런히 출력합니다. 그 결과는 다음과 같습니다.

OrderedDict([('name', '여자친구'),
             ('members', ['소원', '예린', '은하', '유주', '신비', '엄지']),
             ('albums',
              OrderedDict([('EP 1집', 'Season of Glass'),
                           ('EP 2집', 'Flower Bud'),
                           ('EP 3집', 'Snowflake'),
                           ('정규 1집', 'LOL'),
                           ('EP 4집', 'THE AWAKENING')]))])

이렇게 데이터가 정상적으로 읽혔음이 확인되었습니다.

이제 이 데이터들을 읽어서 알맞게 출력하는 프로그램을 만들어 봅시다.

import json
from collections import OrderedDict

with open('gfriend.json', encoding="utf-8") as data_file:    
	data = json.load(data_file, object_pairs_hook=OrderedDict)

# Print
print("걸그룹 %s에 대한 정보는 다음과 같습니다:" % data["name"], end="\n\n")

print(" 멤버: ", end="")
for index, member in enumerate(data["members"]):
    if index > 0: print(", ", end="")
    print(member, end="")
 
print("\n\n [앨범 목록]")
for album, title in data["albums"].items():
    print("  * %s: %s" % (album, title) )

pprint 함수는 여기서는 없어도 무방하므로 제외하고 일단 5번 줄까지는 앞의 코드와 같습니다.

8번 줄부터 데이터를 출력합니다. 파이썬으로 XML 파싱하기와 거의 비슷하지만 XML처럼 데이터를 읽어서 변환하는 과정이 없다는 점이 차이점입니다. JSON 파일을 읽으면 그 자체가 하나의 개체가 되어 바로 참조할 수 있기 때문입니다. JSON 데이터를 data로 불러들였기 때문에 JSON 데이터에 있는 키값이 data 개체이 있는 키값에 대응합니다. 따라서 data["name"]으로 본래의 JSON 데이터에 있는 “name” 키의 값을 불러와서 출력하게 됩니다. 10번 줄부터 13번 줄까지의 멤버 이름 출력 부분도 같습니다.

15번 줄부터 17번 줄까지에 있는 앨범 목록 출력 부분이 좀 다릅니다. “albums” 키의 값이 딕셔너리 형태로 되어 있기 때문에 이를 키와 본값으로 나눠서 출력하기 위해 data["albums"]에다가 items 메소드를 써서 키는 album으로, 본값은 title로 나눕니다. 그리고 album과 title로 나뉜 값을 하나씩 출력해 나가는 것입니다.

프로그램을 실행해 보면 다음과 같이 표시될 것입니다.

걸그룹 여자친구에 대한 정보는 다음과 같습니다:

 멤버: 소원, 예린, 은하, 유주, 신비, 엄지

 [앨범 목록]
  * EP 1집: Season of Glass
  * EP 2집: Flower Bud
  * EP 3집: Snowflake
  * 정규 1집: LOL
  * EP 4집: THE AWAKENING

이렇게 파싱된 JSON 데이터가 표시되면 성공입니다.

2개의 댓글이 있습니다.

  1. OrderedDict 값 만 제공 되었을때 파싱은 어떤 과정으로 해야되나요?
    json 파일이 있는게 아니라 데이터만 있습니다.

    1. 데이터가 혹시 ["소원", "예린", "은하", "유주", "신비", "엄지"] 식으로 키가 없다는 말씀이신가요?
      이 경우도 파싱은 같은 과정입니다. 다만, 키가 없으므로 [0], [1], [2], [3] 이런 식으로 순차적으로 매겨집니다. 즉, 이 경우는 data라는 배열로 저장했다면 data[0] = “소원”, data[1] = “예린” … 이런 식이 됩니다.

      import json
      from collections import OrderedDict
      
      json_str = '["소원", "예린", "은하", "유주", "신비", "엄지"]'
      data = json.loads(json_str, object_pairs_hook=OrderedDict)
      
      # Print
      print(", ".join(data))
      

      이를 실행시켜 보면,

      소원, 예린, 은하, 유주, 신비, 엄지

      이렇게 됩니다.

      사실 키가 없거나 있더라도 키의 순서가 중요하지 않을 경우는 OrderDict를 생략하더라도 무방합니다. 따라서,

      import json
      
      json_str = '["소원", "예린", "은하", "유주", "신비", "엄지"]'
      data = json.loads(json_str)
      
      # Print
      print(", ".join(data))
      

      이와 같이 코딩하더라도 결과는 같습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다