본문 바로가기

Python

Python JSON

Python JSON


JSON은 정보나 객체를 전달하기 위한 표준으로, RFC 7159와 ECMA-404에 명세되어 있다.

파이썬은

  1. 표준라이브러리 차원에서 강력한 JSON 컨버터 제공
  2. 파이썬 타입과 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에 출력한다. 잘 쓰이진 않는다.
구체적으로

  1. skipkeys dict가 주어질 경우, 모든 key가 기본형이어야 한다. 그렇지 않으면 TypeError가 발생한다. TypeError 없이 조용히 무시하려면 skipkeys=True로 설정하면 된다.
  2. ensure_ascii dump()의 결과는 ascii 문자를 제외하면 URL escape처리된다. 이게 싫다면 ensure_ascii=False`로 설정하자. 인생이 소중하다면 바꾸지 말자
  3. 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 딱히 중요한건 없어보인다.


  1. 기본값이다. 들여쓰기나 줄바꿈을 최소화한다.
  2. json.dumps({‘4’: 5, ‘6’: 7}, sort_keys=True, indent=4)와 같이 추가 옵션을 지정하면 된다.

'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