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)
'IT > Python' 카테고리의 다른 글
파이썬 기본 개요 - 웹 크롤링 1 (beautiful soup Module) (0) | 2021.05.12 |
---|---|
파이썬 기본 개요 - JSON 2 (예제) (0) | 2021.05.10 |
파이썬 기본 개요 - CSV (0) | 2021.05.07 |
파이썬 기본 개요 - 오류, Exception (0) | 2021.05.06 |
Python3 - 데이터 Encoding/Decoding (0) | 2021.05.04 |