2.28. JSON

JSON(JavaScript Object Notation)은 구조화된 데이터를 위한 간결하고 사람이 읽을 수 있는 텍스트 형식입니다. 여섯 가지 타입을 정의합니다 – 문자열, 숫자, 불리언, null, 배열, 객체 – 각각은 Python 값에 직접 대응되므로, Python과 JSON 사이의 변환은 양방향 모두 단일 함수 호출입니다.

JSON은 설정 파일과 웹 API의 공용어입니다. 작은 설정 묶음을 눈으로도 읽을 수 있는 형태로 디스크에 저장해야 하거나, 다른 프로그램과 구조화된 데이터를 주고받아야 할 때마다 활용하십시오.

두 함수가 대부분의 필요를 충족합니다:

  • json.dumps()dump string: Python 값을 JSON 문자열로 바꿉니다.

  • json.loads()load string: JSON 문자열을 다시 Python으로 파싱합니다.

json.dump / json.load 쌍(s 없음)은 같은 일을 하지만 파일 객체를 직접 받습니다.

2.28.1. 인코딩 (dumps)

import json

config = {
    "name":  "OpenMV",
    "width": 320,
    "tags":  ["red", "round"],
}

text = json.dumps(config)
print(text)

출력:

{"name": "OpenMV", "width": 320, "tags": ["red", "round"]}

대응 관계는 다음과 같습니다:

그 집합 밖의 것(사용자 정의 클래스, bytes 버퍼, set)은 TypeError 를 발생시킵니다. 먼저 값을 변환하십시오.

참고

CPython의 json.dumps() 는 보기 좋게 출력하기 위한 indent 인수를 받지만, MicroPython의 것은 받지 않습니다. 유일한 형식 조정 옵션은 인라인 간격을 제어하는 separators 입니다 – 가장 간결한 형태를 위해 (',', ':') 를 전달하십시오. 여러 줄로 들여쓴 출력이 필요하다면 직접 만들어야 합니다.

2.28.2. 디코딩 (loads)

text = '{"name": "OpenMV", "width": 320}'
config = json.loads(text)
print(config["name"], config["width"])

출력:

OpenMV 320

JSON 객체는 dict 가 되고, 배열은 list 가 되며, 나머지는 각자의 Python 등가물로 다시 대응됩니다. 잘못된 JSON은 ValueError 를 발생시킵니다.

2.28.3. 파일 읽고 쓰기

파일 기반 쌍은 with 와 잘 어울립니다:

import json

with open("config.json") as f:
    config = json.load(f)

config["width"] = 640

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

JSON 파일을 완전한 레코드로 취급하십시오 – 읽어 들이고, Python 값을 수정하고, 다시 써넣습니다. 파일 안에서 JSON을 제자리에서 편집하려고 하면 보통 절약하는 것보다 더 많은 버그를 만듭니다.