Khi làm việc với dữ liệu lồng nhau (nested JSON), thường cần làm phẳng (flatten) bằng cách nối khóa cha và khóa con với dấu phân cách.
Cách 1: Đệ quy (recursive)
Viết hàm đệ quy duyệt dictionary. Nếu giá trị là dictionary, gọi đệ quy với khóa cha mới (khóa cha + separator + khóa con). Nếu không, gán vào dictionary kết quả.
Ví dụ
dictA = {
"id": "0001",
"name": "hotdog",
"image": {
"url": "images/0001.jpg",
"thumbnail": {
"url": "images/thumbnails/0001.jpg",
"height,width": "2x4"
}
}
}
def dict_flatten(in_dict, dict_out=None, parent_key=None, separator="_"):
if dict_out is None:
dict_out = {}
for k, v in in_dict.items():
k = f"{parent_key}{separator}{k}" if parent_key else k
if isinstance(v, dict):
dict_flatten(in_dict=v, dict_out=dict_out, parent_key=k)
continue
dict_out[k] = v
return dict_out
final_dict = dict_flatten(dictA)
print(final_dict)
Kết quả
{
'id': '0001',
'name': 'hotdog',
'image_url': 'images/0001.jpg',
'image_thumbnail_url': 'images/thumbnails/0001.jpg',
'image_thumbnail_height,width': '2x4'
}
Cách 2: Sử dụng thư viện cherrypicker
Thư viện cherrypicker cung cấp phương thức flatten() trực tiếp.
Ví dụ
from cherrypicker import CherryPicker
dictA = {
"id": "0001",
"name": "hotdog",
"image": {
"url": "images/0001.jpg",
"thumbnail": {
"url": "images/thumbnails/0001.jpg",
"height,width": "2x4"
}
}
}
picker = CherryPicker(dictA)
print(picker.flatten().get())
Kết quả
{
'id': '0001',
'name': 'hotdog',
'image_url': 'images/0001.jpg',
'image_thumbnail_url': 'images/thumbnails/0001.jpg',
'image_thumbnail_height, width': '2x4'
}