Python JSON
JSON은 정보나 객체를 전달하기 위한 표준으로, RFC 7159와 ECMA-404에 명세되어 있다.
파이썬은
- 표준라이브러리 차원에서 강력한 JSON 컨버터 제공
- 파이썬 타입과 JSON타입의 유사성
이라는 장점이 있어 쉽게 JSON과 친해질 수 있다.
한번 해 보자. 이 글을 공식 문서를 참고해 작성했다.
Cheat Sheet
Python object -> JSON (Encoding)
import json
json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}]) #'["foo", {"bar": ["baz", null, 1.0, 2]}]'
json.dumps("\"foo\bar") #"\"foo\bar"
json.dumps('\u1234') #"\u1234"
json.dumps('\\') #"\\"
json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True) #{"a": 0, "b": 0, "c": 0}
from io import StringIO
io = StringIO()
json.dump(['streaming API'], io)
io.getvalue() #'["streaming API"]'
그냥 파이썬 타입을 넣고 dumps()를 돌리면 된다.
마지막 예제는 io.StringIO와의 연계를 보여준다.
json 모듈은 데이터 용량을 줄위기 위한 Compact Encoding1과 개발자가 읽기 쉬운 형태인 Pretty printing 2을 모두 지원한다.
JSON -> Python object (Decoding)
import json
json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]') #['foo', {'bar': ['baz', None, 1.0, 2]}]
json.loads('"\\"foo\\bar"') #'"foo\x08ar'
from io import StringIO
io = StringIO('["streaming API"]')
json.load(io) #['streaming API']
위에서는 dumps()
였다면 이번에는 loads()
다.
Advanced
json.dump(obj, fp)
json.dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
Python object를 JSON으로 바꾸고 fp
에 출력한다. 잘 쓰이진 않는다.
구체적으로
- skipkeys dict가 주어질 경우, 모든 key가 기본형이어야 한다. 그렇지 않으면
TypeError
가 발생한다.TypeError
없이 조용히 무시하려면skipkeys=True
로 설정하면 된다. - ensure_ascii dump()의 결과는 ascii 문자를 제외하면 URL escape처리된다. 이게 싫다면 ensure_ascii=False`로 설정하자. 인생이 소중하다면 바꾸지 말자
- indent 값을 설정하면 설정한 만큼 들여쓰기를 한다. 기본 값은
None
인데, 이 경우 compact처리를 의미 한다.
json.dumps(obj)
json.dump()
와 하는 일이 똑같다. 대신 결과물을 str
형태로 반환한다. 자주 쓰인다.
loads(dumps(dict_has_not_only_str_key)) != dict_has_not_only_str_key라는 것을 잊으면 안된다. JSON이 되는 과정에서 모든 keys는 str으로 타입이 바뀌기 때문
json.loads(s)
JSON -> Python object 딱히 중요한건 없어보인다.
'Python' 카테고리의 다른 글
Python itertools (0) | 2016.02.09 |
---|---|
Python zip archive of a directory (0) | 2016.02.09 |
python multiprocessing (0) | 2016.02.09 |
python multiprocessing AttributeError (0) | 2016.02.08 |
os.path 사용하기 (0) | 2016.01.13 |