Profile picture

[Python] json 모듈 사용하기

JaehyoJJAng2023년 03월 21일

▶︎ json

JSON은 JavaScript Object Notation의 약자로서 데이터를 문자열의 형태로 나타내기 위해서 사용된다.

이름에서 암시하듯이 JSON은 자바스크립트에서 파생되었지만 현재는 프로그래밍과 무관하게 거의 표준으로 자리잡아 이종 시스템 간에 원격으로 데이터를 주고 받을 때 사용되고 있다.


▶︎ json 모듈 실습

‣ loads() 함수

JSON 문자열을 파이썬 객체로 변환하기 위해서는 loads() 함수를 사용한다.

import json

js_string: str = '''{
    "id": 1,
    "dir": "/usr/src/app",
    "projectName": "parsingTest",
    "userInfos": [
        {
        "name": "user1",
        "password": "****",
        "nickname": "johhhhh1"
        },
        {
            ...
        }
    ]
    "alarm": false,
    "books": null
}'''

json_object = json.loads(js_string)

assert json_object['id'] == 1
assert json_object['projectName'] == 'parsingTest'
assert json_object['userInfos'][0]['name'] == 'user1'
assert json_object['alarm'] is False
assert json_object['books'] is None

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


‣ dumps() 함수

파이썬의 객체를 JSON 문자열로 변환할 때에는 dumps() 함수를 사용한다.

import json
json_object: dict = {
    "id": 1,
    "dir": "/usr/src/app",
    "projectName": "parsingTest",
    "userInfos": [
        {
        "name": "user1",
        "password": "****",
        "nickname": "johhhhh1"
        },
    ],
    "alarm": False,
    "books": None
}

json_string = json.dumps(json_object)
print(json_string)
{"id": 1, "dir": "/usr/src/app", "projectName": "parsingTest", "userInfos": [{"name": "user1", "password": "****", "nickname": "johhhhh1"}], "alarm": false, "books": null}

dumps()로 변환되는 JSON 문자열을 위와 같이 한 줄이기 때문에 파이썬 객체가 많은 데이터를 담고 있는 경우 가독성이 매우 떨어질 수 있다.

이런 경우 indent 파라미터에 숫자를 넘기면 그 만큼 들여쓰기가 되어 JSON 문자열로 반환된다.

import json
json_object: dict = {
    "id": 1,
    "dir": "/usr/src/app",
    "projectName": "parsingTest",
    "userInfos": [
        {
        "name": "user1",
        "password": "****",
        "nickname": "johhhhh1"
        },
    ],
    "alarm": False,
    "books": None
}

json_string = json.dumps(json_object, indent=4)
print(json_string)
{
    "id": 1,
    "dir": "/usr/src/app",
    "projectName": "parsingTest",
    "userInfos": [
        {
            "name": "user1",
            "password": "****",
            "nickname": "johhhhh1"
        }
    ],
    "alarm": false,
    "books": null
}

‣ load() 함수

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

input.json

{
    "id": 1,
    "dir": "/usr/src/app",
    "projectName": "parsingTest",
    "userInfos": [
        {
            "name": "user1",
            "password": "****",
            "nickname": "johhhhh1"
        }
    ],
    "alarm": false,
    "books": null
}
import json

with open('input.json', 'r') as fp:
    json_object = json.load(fp)

assert json_object['id'] == 1
assert json_object['projectName'] == 'parsingTest'
assert json_object['userInfos'][0]['name'] == 'user1'
assert json_object['alarm'] is False
assert json_object['books'] is None

JSON 포맷의 HTTP 응답 body를 읽을 때에도 이 방식이 사용된다.


‣ dump() 함수

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

import json
json_object: dict = {
    "id": 1,
    "dir": "/usr/src/app",
    "projectName": "parsingTest",
    "userInfos": [
        {
        "name": "user1",
        "password": "****",
        "nickname": "johhhhh1"
        },
    ],
    "alarm": False,
    "books": None
}

with open('output.json', 'w') as fp:
    json.dump(json_object, fp=fp, indent=2)

output.json

{
  "id": 1,
  "dir": "/usr/src/app",
  "projectName": "parsingTest",
  "userInfos": [
    {
      "name": "user1",
      "password": "****",
      "nickname": "johhhhh1"
    }
  ],
  "alarm": false,
  "books": null
}

Loading script...