본문 바로가기
IT/programming

[PYTHON] nested JSON 변환 / comparing two nested JSON

by 어느해겨울 2022. 1. 27.

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 매치하는게 가독성에도 좋고 구조도 단순해지기 때문에 선호한다. 그 외에는 응용하여 사용하면 된다. 

 

끝.

 

 

 

 

댓글