인코딩 디코딩 방식은 다른 방식도 많음
참고만하세요
json.dumps 에서는 ' 와 \ 를 제외한 특수기호에 에러를 일으키지 않는다
' 이거는 json 을 감싸주는 역할이므로
\ 원화표시는 특수기호를 지칭하는 특특수기호~ 이라서
딕셔너리
리스트,딕셔너리 딕셔너리
바이트 ( 바로 변환불가 str로 변환후 json 해줘야함 )
여기서 볼부분은 \ 표시임. json 에서는 ' ' 안에 " " 를 넣어서 표현하는데(' " " ') 이런 경우는 " " 안에 ' ' 이 들어가야 하는 상황이다.(' " ' ' , ' ' " ') 따라서 " " 안에 들어가는 ' ' 에게는 \표시를 넣어서 표현한다. (' " ' ' , ' ' " ') -> (' " \' \' , \' \' " ')
바이트 어레이(리스트)
원래 그냥 리스트는 json.dumps 가 되지만 리스트 안에있는 바이트는 바로 변환이 안됨. 따라서 여기서도 string으로 변환 후 해주면 가능. ( str 변환해서 하면 편하긴한데 그러면 json.loads 하는쪽에서도 str을 한번 더 풀어줘야함 )
========================================PS 내용 ==============================
MQTT 쓰다가 발견함
>>> _payload = {'agent_id': 'AGENT_ID','format': 'param_ros_msg_type','hash': 'None','seq_id': 'str(param_ros_msg_type.header.seq)','height': '480','width': '640','distance': '0','zone': '0','raw_data': str(b'[ 1, 2, 3, 4, 5]') }
>>> payload = json.dumps(_payload, ensure_ascii=False)
>>> byte_payload = bytes(payload, 'utf-8')
>>>
>>>
>>> dict_payload = json.loads(byte_payload)
>>> dict_payload
{'agent_id': 'AGENT_ID', 'format': 'param_ros_msg_type', 'hash': 'None', 'seq_id': 'str(param_ros_msg_type.header.seq)', 'height': '480', 'width': '640', 'distance': '0', 'zone': '0', 'raw_data': "b'[ 1, 2, 3, 4, 5]'"}
>>>
>>>
>>> type(_payload)
<class 'dict'>
>>> type(payload)
<class 'str'>
>>> type(byte_payload)
<class 'bytes'>
>>>
>>>
>>>
>>> type(dict_payload)
<class 'dict'>
'raw_data': "b'[ 1, 2, 3, 4, 5]'" 부분을 잘봐야댐
결론은 jason 형태의 스트링화된 바이트를 json.load 하면 한번에 바이트 풀고 스트링 풀어서 딕셔너리로 만들어줌
1. bytes 를 스트링으로 만든 딕셔너리 타입을 하나 만들었고
2. 딕셔너리를 바이트화 함.
1,2 패킹을 했는데
3. json.load
3 번 한번으로 언패킹 작업을 둘다 해줌
'언어 정리 > python_lib,일급함수' 카테고리의 다른 글
unittest tutorial 개념 정리 (1) | 2022.09.19 |
---|---|
with 함수 ( __enter__, __exit__ ) (0) | 2022.09.19 |
import contextvars 설명 (2) | 2022.08.28 |
functools.partial() 정리 (0) | 2022.08.17 |
PIL , 출력문 저장 lib(write,print,sys.out) (0) | 2022.08.04 |
댓글