본문 바로가기
IT/Python

파이썬 기본 개요 - JSON(1)

by 천빈 2021. 5. 10.

JSON

  • Java Script Object Notation
  • 데이터 교환용으로 설계된 경량 텍스트 기반 개방형 표준을 뜻한다.
  • application/json 이고 .json 확장자를 가진다.
  • c, c++, javja, python, perl 등을 포함한 규칙을 사용한다.
  • 브랑줘 확장 프로그램 또는 웹사이트를 포함하는 자바스크립트 기반 응용프로그램을 작성할 떄 사용된다.
  • 이 형식은 네트워크 ㅕㄴ결을 통해 구조화 된 데이터를 직렬화 및 전송하는데 사용되며, 주로 서버나 웹 응용 프로그램간에 데이터를 전송하는데 사용된다.
  • web service와 api는 공개 데이터를 제공하기 위해 이 형식 사용
  • .xml은 파싱(일련의 문자열을 파스 트리로 만듦)하기 위해 메모리에 올려두고 사용
  • 데이터량이 커지면 파싱자체에 부하가 걸리거나 실패할 수 있다. 그래서 .json을 사용한다.

 

 

JSON 특징

  • 텍스트 기반으로 읽고 쓰는것이 간단
  • 프로그램 언어와 플랫폼에 독립적이므로 서로 다른 시스템간에 객체를 교환한다.
  • 자바스크립트 문법을 사용한다
  • JSON 전용 파서 기느을 웹 브라우저에 내장
  • 데이터포맷 XML보다 경량이다.
  • 통신 프로토콜을 실행한다
  • XML데이터는 모두 string인 반면, json으 타입을 가진다

"17" -> 17

<용돈? 90000</용돈> -> 90000

 

 

Json

파이썬

오브젝트(object)

dict

배열(array)

list

문자열(string)

str

숫자 (정수)

int

숫자 (실수)

float

true

True

false

False

null

None

 

웹 서비스 

- 링크입력

 

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)
    • 객체를 dict/list로 변환해서 지정된 파일에 문자열로 저장
  • 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)
    • 객체를 dict/list로 변환해서 문자열로 리턴
  • load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
    • 파일에서 Json 형식ㅇㄹ 로드해서 python list/dict로 리턴
  • loads(s, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
    • Json형식을 로드해서 dict/list로 리턴

 

Test Josn

 

1. 데이터를 리스트 형태로 선언하고, repr로 str 리턴 형태를 확인한다

import json
def test01():
    data = [{'a': 'A', 'b': (2,4), 'c':(3.0)}]
    print('data :', data, 'repr(data) :', repr(data))   # 해당 리스트를 문자열로 리턴해준다
    print(type(data), type(repr(data)))

if __name__ == '__main__':
    test01()

data : [{'a': 'A', 'b': (2, 4), 'c': 3.0}] repr(data) : [{'a': 'A', 'b': (2, 4), 'c': 3.0}]
<class 'list'> <class 'str'>

 

!! repr와 str은 문자열을 리턴한다는 공통점이 있지만 repr은 해당 객체를 만들 수 있는 문자열’로 출력된다.

>>> a = 'python'

>>> print(str(a), repr(a))
python 'python'
>>> a = python
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'python' is not defined

>>> a = 'python'

# srt로 리턴된 값은 에러가 뜨지만 repr로 리턴한 값은 객체를 만들 수 있는 문자열로 출력되는 것을 알 수 있다.

 

 

2. json.dumps 확인

data_string = json.dumps(data)
    print('json :', data_string, type(data_string))
 
json : [{"a": "A", "b": [2, 4], "c": 3.0}] <class 'str'>

 

 

3. Encode/Decode 확인

def test02():
    data = "{'a': 'A', 'b': (2,4), 'c':(3.0)}"   # 파이썬은 ',"든 문자열로 반환하지만 json은 "을 문자열로 리턴한다.
    data_str = json.dumps(data)
    #data_str = json.dumps(data, indent=4, sort_keys=True)
    # indent: json 객체의 타입이 문자열이나 정수이면 들여쓰기 해준다
    # sort_keys : 값을 true로 지정해 정렬 사용
    print('Encode :', data_str)
    repr(data_str)

    decode = json.loads(data_str)
    print('decode :', decode)
    
Encode : "{'a': 'A', 'b': (2,4), 'c':(3.0)}"
decode : {'a': 'A', 'b': (2,4), 'c':(3.0)}

# 파이썬은 ', "를 구분하지 않고 문자열로 받아들이지만 json은 그렇지 못하다. 따라서 "data"를 선언할 경우 그 자체를 문자열로 인식한다.

def test02():
    data = {'a': 'A', 'b': (2,4), 'c':(3.0)}   
    data_str = json.dumps(data)
    #data_str = json.dumps(data, indent=4, sort_keys=True)
    # indent: json 객체의 타입이 문자열이나 정수이면 들여쓰기 해준다
    # sort_keys : 값을 true로 지정해 정렬 사용
    print('Encode :', data_str)
    repr(data_str)

    decode = json.loads(data_str)
    print('decode :', decode)

Encode : {"a": "A", "b": [2, 4], "c": 3.0}
decode : {'a': 'A', 'b': [2, 4], 'c': 3.0}

# data를 dict 형태로 선언할 경우, json.dumps()를 통해 dict 값의 키들에 " " 를 씌운것을 확인할 수 있다.

>>> help(json)
 >>> import json
 
        >>> json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])
        '["foo", {"bar": ["baz", null, 1.0, 2]}]'
        
            >>> print(json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True))
        {"a": 0, "b": 0, "c": 0}

# help(json)에 이와같은 내용을 확인할 수 있다.

 

 

4. Json type 리턴 값 확인

def test03():
    obj_json = '{"str" : [42.2], "str01": 42}'
    obj= json.loads(obj_json)
    print(obj)                              # 문자열로 리턴
    print(json.dumps(obj, sort_keys=True))  # json type 값으로 리턴

{'str': [42.2], 'str01': 42}
{"str": [42.2], "str01": 42}

 

 

5. json.dump()를 통해 파일에 쓰기

def test04():
    obj_json = '{"str" : [42.2], "str01": 42}'
    json.dump(obj_json, fp="data.json", indent=4, sort_keys=True)

Traceback (most recent call last):
  File "C:\PythonWorkPJ\Day0510\com\test_json.py", line 33, in <module>
    test04()
  File "C:\PythonWorkPJ\Day0510\com\test_json.py", line 30, in test04
    json.dump(obj_json, fp="data.json", indent=4, sort_keys=True)
  File "C:\python\Python39\lib\json\__init__.py", line 180, in dump
    fp.write(chunk)
AttributeError: 'str' object has no attribute 'write'

# 에러 메세지를 통해 'write' 권한이 없다는걸 확인한다.

def test04():
    obj_json = {"str" : [42.2], "str01": 42}
    with open("data.json", 'w') as w:
        json.dump(obj_json,w,indent=4)
    with open("data.json",'rt') as r:
        s = json.load(r)
        print(s)
        
{'str': [42.2], 'str01': 42}
{
    "str": [
        42.2
    ],
    "str01": 42
} #data.json의 모습

 

 

6. object_hook

import json

data = {"str" : [42.2], "str01": 42}  	# dict형태라 json이 못 받아들임


class my_jsonObj:                       # json.load를 통해 임의의 사용자 클래스를 선언
    def __init__(self, d):
        self.__dict__ = d               # 최상위(부모)클래스의 생성자 를 d에 호출


if __name__ == '__main__':
    data = json.loads(data,object_hook=my_jsonObj)  # 임의의 my_jsonObj 클래스 입력력
    print(data, type(data))
   
TypeError: the JSON object must be str, bytes or bytearray, not dict

# object_hook : 대상을 클래스인 객체의 형태로 접근이 가능하다.

# data형태가 dict기 떄문에 타입에러 발생

data = '{"str" : [42.2], "str01": 42}'

<__main__.my_jsonObj object at 0x000001561E7E6FA0> <class '__main__.my_jsonObj'>
class my_jsonObj:                       # object_hook를 통해 임의의 사용자 클래스를 선언
    def __init__(self, d):
        self.__dict__ = d               # 최상위(부모)클래스의 생성자호출
        								# '''선언된 j_data의 형태를 dict 형태로 출력


if __name__ == '__main__':
    data = json.loads(j_data,object_hook=my_jsonObj)  # 대상을 클래스인 객체로 연동해서 구현된다.
    print(data, type(data))
    print(data.name, type(data.name))
    print(data.addr)
    for brothers in data.brothers:
        print(brothers)