Logo

파이썬의 json 모듈로 JSON 데이터 다루기

JSON은 JavaScript Object Notation의 약자로서 데이터를 문자열의 형태로 나타내기 위해서 사용되는데요. 이름이 암시하듯 JSON은 원래 자바스크립트에서 파생되었지만 현재는 프로그래밍 언어와 무관하게 거의 표준으로 자리잡아 특히 이종의 시스템 간에 원격으로 데이터를 주고 받을 때 많이 사용되고 있습니다.

이번 포스팅에서는 파이썬에서 JSON 형태의 데이터를 처리하기 위해서 사용되는 내장 모듈인 json에 대해서 알아보도록 하겠습니다.

loads() 함수: JSON 문자열을 Python 객체로 변환

JSON 문자열을 Python의 객체로 변환하기 위해서는 loads() 함수를 사용합니다.

import json

json_string = '''{
    "id": 1,
    "username": "Bret",
    "email": "Sincere@april.biz",
    "address": {
        "street": "Kulas Light",
        "suite": "Apt. 556",
        "city": "Gwenborough",
        "zipcode": "92998-3874"
    },
    "admin": false,
    "hobbies": null
}'''

json_object = json.loads(json_string)

assert json_object['id'] == 1
assert json_object['email'] == 'Sincere@april.biz'
assert json_object['address']['zipcode'] == '92998-3874'
assert json_object['admin'] is False
assert json_object['hobbies'] is None

일반적으로 파일에 저장되어 있는 JSON 문자열을 읽거나, HTTP 요청의 전문(body)을 읽을 때 자주 사용됩니다.

dumps() 함수: Python 객체를 JSON 문자열로 변환

Python의 객체를 JSON 문자열로 변환하기 위해서는 dumps() 함수를 사용합니다.

import json

json_object = {
    "id": 1,
    "username": "Bret",
    "email": "Sincere@april.biz",
    "address": {
        "street": "Kulas Light",
        "suite": "Apt. 556",
        "city": "Gwenborough",
        "zipcode": "92998-3874"
    },
    "admin": False,
    "hobbies": None
}

json_string = json.dumps(json_object)
print(json_string)
콘솔
{"id": 1, "username": "Bret", "email": "Sincere@april.biz", "address": {"street": "Kulas Light", "suite": "Apt. 556", "city": "Gwenborough", "zipcode": "92998-3874"}, "admin": false, "hobbies": null}

디폴트로 변환되는 JSON 문자열은 위와 같이 한 줄이기 때문에 Python 객체가 많은 데이터를 담고 있는 경우, 가독성이 떨어질 수 있습니다. 이럴 경우, indent 파라미터에 숫자를 넘기면 그 만큼 들여쓰기가 되어 JSON 문자열로 변환이 됩니다.

import json

json_object = {""" 위와 동일 """}

json_string = json.dumps(json_object, indent=2)
print(json_string)
콘솔
{
  "id": 1,
  "username": "Bret",
  "email": "Sincere@april.biz",
  "address": {
    "street": "Kulas Light",
    "suite": "Apt. 556",
    "city": "Gwenborough",
    "zipcode": "92998-3874"
  },
  "admin": false,
  "hobbies": null
}

load() 함수: JSON 파일을 Python 객체로 불러오기

JSON 파일에 저장된 데이터를 읽어서 Python 객체로 불러오고 싶은 경우에는 loads() 대신에 load() 함수를 사용합니다.

input.json
{
  "id": 1,
  "username": "Bret",
  "email": "Sincere@april.biz",
  "address": {
    "street": "Kulas Light",
    "suite": "Apt. 556",
    "city": "Gwenborough",
    "zipcode": "92998-3874"
  },
  "admin": false,
  "hobbies": null
}
import json

with open('input.json') as f:
    json_object = json.load(f)

assert json_object['id'] == 1
assert json_object['email'] == 'Sincere@april.biz'
assert json_object['address']['zipcode'] == '92998-3874'
assert json_object['admin'] is False
assert json_object['hobbies'] is None

일반적으로 JSON 포맷의 HTTP 응답 전문(body)을 읽을 때도 이 방식이 사용됩니다.

dump() 함수: Python 객체를 JSON 파일에 저장하기

Python 객체를 JSON 문자로 변환한 결과를 파일에 바로 쓰고(write) 싶은 경우에는 dumps() 대신에 dump() 함수를 사용합니다.

import json

json_object = {
    "id": 1,
    "username": "Bret",
    "email": "Sincere@april.biz",
    "address": {
        "street": "Kulas Light",
        "suite": "Apt. 556",
        "city": "Gwenborough",
        "zipcode": "92998-3874"
    },
    "admin": False,
    "hobbies": None
}

with open('output.json', 'w') as f:
    json.dump(json_object, f, indent=2)
output.json
{
  "id": 1,
  "username": "Bret",
  "email": "Sincere@april.biz",
  "address": {
    "street": "Kulas Light",
    "suite": "Apt. 556",
    "city": "Gwenborough",
    "zipcode": "92998-3874"
  },
  "admin": false,
  "hobbies": null
}

일반적으로 JSON 포맷의 HTTP 요청 전문(body)을 쓸 때도 이 방식이 사용됩니다.

전체 코드

본 포스팅에서 제가 작성한 전체 코드는 아래에서 직접 확인하고 실행해보실 수 있습니다.

https://dales.link/3qj

마치면서

이상으로 파이썬의 json 모듈의 loads(), dumps(), load(), dump() 함수를 사용하는 법을 살펴보았습니다. json 내장 모듈에 대한 좀 더 자세한 설명은 파이썬 공식 레퍼런스: json — JSON encoder and decoder를 참고 바랍니다.