Json 에서 Dict 까지

JSON 이란


위키백과에 따르면 JSON은 아래처럼 정리할 수 있다.

JSON(JavaScript Object Notation)은 속성-값 쌍(attribute–value pairs), 배열 자료형(array data types) 또는 기타 모든 시리얼화 가능한 값(serializable value) 또는 "키-값 쌍"으로 이루어진 데이터 오브젝트를 전달하기 위해 인간이 읽을 수 있는 텍스트를 사용하는 개방형 표준 포맷이다. 비동기 브라우저/서버 통신 (AJAX)을 위해, 넓게는 XML(AJAX가 사용)을 대체하는 주요 데이터 포맷이다. 특히, 인터넷에서 자료를 주고 받을 때 그 자료를 표현하는 방법으로 알려져 있다. 자료의 종류에 큰 제한은 없으며, 특히 컴퓨터 프로그램의 변수값을 표현하는 데 적합하다.

본래는 자바스크립트 언어로부터 파생되어 자바스크립트의 구문 형식을 따르지만 언어 독립형 데이터 포맷이다. 즉, 프로그래밍 언어나 플랫폼에 독립적이므로, 구문 분석 및 JSON 데이터 생성을 위한 코드는 C, C++, C#, 자바, 자바스크립트, 펄, 파이썬 등 수많은 프로그래밍 언어에서 쉽게 이용할 수 있다.

지금까지 Postman으로 자주 찍어본 JSON의 형식은 아래처럼 구성되어 있다.

{
 "id"             : 1, #int
 "name"           : "Test", #String
 "birth"          : 19890203, #int
 "interests"      : ["코딩", "운동", "음악감상"], #list
 "finance_status" : {"자산" : 100 #dictionary(object)
                     "부채" : 30
                     "자본" : 70
                     } 
 }

위 처럼 JSON은 자바스크립트를 따르면서 값으로는 숫자(number), 문자열(string), 불리언(boolean), 객체(object), 배열(array), Null을 가질 수 있다.

파이썬에서


파이썬에서 제공하는 Type은 JSON에서 제공하는 Type과 1:1 매칭이 가능하게 설계되어 있다. 아래 표를 참고하자.

JSON에서 인코딩 방식은 UTF-8, 16, 32를 사용할 수 있으며, 최대 호환성을 보장하기 위해서 사용하는 인코딩 방식은 UTF-8이다. 또한 인코딩 Byte 순서 (BOM)를 추가하는 것은 금지되어 있다.

파이썬에서 JSON을 활용하기 위해서는 json모듈을 사용하면 된다.
JSON은 str 혹은 byte 형태로만 되어있어야 한다. 만약 사전형식으로 구성되어 전달되면 아래와 같은 오류가 발생한다.

## JSON이 위 처럼 온다고 가졍

import json

json_content = {
               "id"             : 1,
               "name"           : "Test",
               "birth"          : 19890203,
               "interests"      : ["코딩", "운동", "음악감상"],
               "finance_status" : {"자산" : 100
                                   "부채" : 30
                                   "자본" : 70
                                   } 
               }


json.loads(json_content)
>>>
TypeError: the JSON object must be str, bytes or bytearray, not dict

위 content를 ''로 묶어서 str로 변경해주자.

import json

json_content = '{
               "id"             : 1,
               "name"           : "Test",
               "birth"          : 19890203,
               "interests"      : ["코딩", "운동", "음악감상"],
               "finance_status" : {"자산" : 100
                                   "부채" : 30
                                   "자본" : 70
                                   } 
               }'

type(json_content)
type(json.loads(json_content))
>>>

<class 'str'>
<class 'dict'>

기본적으로 파이썬에서는 JSON의 형태로 변경시키기 위해서는 json모듈의 dump와 dumps를 이용하면 된다.

공식문서에 나와있는 dump와 dumps의 사용법은 각각 아래와 같다.

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)

json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)

dump와 dumps의 차이점은 dump는 obj를 JSON 형식 스트림으로 write()를 지원하는 파일류 객체로 직렬화 한다는 것이며, dumps는 obj를 JSON 형식의 str로 직렬화한다는 것이다.

json을 읽는 방법은 위 코드에서도 보았듯이 json모듈의 load와 loads를 이용하면 된다. load와 loads 역시 dump, dumps와 같은 차이가 있다.

json.load는 .read()를 지원하는 텍스트 파일이나 바이너리 파일을 파이썬 객체로 역직렬화 하며, json.loads는 str, bytes 또는 bytearray 인스턴스를 파이썬 객체로 역직렬화 한다.

사용법은 아래와 같다.

json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

json.loads(s, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

장고에서


json dump가 아니라 장고내에 내장되어 있는 django.http import JsonResponse 를 사용하자! ㅎㅎ.

끝!

좋은 웹페이지 즐겨찾기