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을 제자리에서 편집하려고 하면 보통 절약하는 것보다 더 많은 버그를 만듭니다.