nested JSON 변환
예제 1.
재귀를 이용해 nested 구조의 key들을 flat 하게 만들어서 dictionary에 key/value 로 저장을 하는 예제이다.
소스코드
"""
# JSON data format
{
"Key_A": "A",
"Key_B": {
"B_1": "1",
"B_2": "2"
},
"Key_C": "C"
}
"""
import json
json_data = json.loads('{ "Key_A": "A", "Key_B": { "B_1": "1", "B_2": "2" }, "Key_C": "C" }')
def parse_nested_json(_json, _path, _parent = "") :
for key in _json :
if type(_json[key]) == dict :
parse_nested_json(_json[key], _path, "{}/{}".format(_parent, key))
else :
_path[("{}/{}".format(_parent, key))] = _json[key]
return _path
arr_json_list = {}
parse_nested_json(json_data, arr_json_list)
for key in arr_json_list :
print("Key: [{}], Value: [{}]".format(key, arr_json_list[key]))
결과
nested 구조의 JSON object가 dict타입 key/value 로 변환된 것을 확인할 수 있다.
Key: [/Key_A], Value: [A]
Key: [/Key_B/B_1], Value: [1]
Key: [/Key_B/B_2], Value: [2]
Key: [/Key_C], Value: [C]
예제 2.
comparing two nested JSON 라고 표현하면 되려나. nested한 JSON 간 구조를 비교할 땐 이런 방식이 꽤 유용하다.
아래 소스코드를 이용하여 2개의 JSON을 dict.로 변환 후 for in / if not key in 으로 검사하면 된다.
소스코드
import json
json_default_data = json.loads('{ "Key_A": "A", "Key_B": { "B_1": "1", "B_2": "2" } }')
json_request_data = json.loads('{ "Key_A": "A", "Key_B": { "B_1": "1", "B_2": "2" }, "Key_C": "C" }')
def parse_nested_json(_json, _path, _parent = "") :
for key in _json :
if type(_json[key]) == dict :
parse_nested_json(_json[key], _path, "{}/{}".format(_parent, key))
else :
_path[("{}/{}".format(_parent, key))] = _json[key]
return _path
arr_default_json_list = {}
parse_nested_json(json_default_data, arr_default_json_list)
arr_request_json_list = {}
parse_nested_json(json_request_data, arr_request_json_list)
for key in arr_request_json_list :
if not key in arr_default_json_list :
print("Not found key : {}".format(key))
결과
request data와 default data를 비교했을 때 request에는 있고 default는 없는 key를 찾아낸다.
Not found key : /Key_C
아무래도 nested object/array/dictionary 구조를 하나하나 매치해보는 것보단 직렬화/flat화를 시켜 string 매치하는게 가독성에도 좋고 구조도 단순해지기 때문에 선호한다. 그 외에는 응용하여 사용하면 된다.
끝.
'IT > programming' 카테고리의 다른 글
[C++] 프로그래머스, 전화번호 목록 (0) | 2022.02.16 |
---|---|
[PYTHON] 유효한 날짜 포맷 확인 / 정규식, re (6) | 2022.01.28 |
[PYTHON] 유효한 날짜 포맷 확인 / datetime (1) | 2022.01.27 |
[C/C++] C언어 파일 생성/삭제 이벤트 모니터링 / inotify, event monitoring (1) | 2022.01.20 |
[C/C++] C언어 mmap, msync, munmap 설명 (4) | 2022.01.19 |
댓글