一、背景

所负责的项目从v1.0升级到v2.0之后,发送到kafka的Json数据字段顺序和内容有所改变,
v1.0版本推送数据样例:

{
  "name": "小王子",
  "author": "安托万·德·圣-埃克苏佩里(1900-1944)",
  "platform": "京东",
  "detailinfo": {
    "commodity code": "12157218",
    "published date": "2017-02-01",
    "published house": " 浙江文艺出版社",
    "number of pages": 208
  },
  "content": "遥远星球上的小王子,与美丽而骄傲的玫瑰吵架负气出走,在各星球漫游中,小王子遇到了傲慢的国王,一个任性的酒鬼,一个唯利是图的商人,一个死守教条的地理学家,而后来到地球上,试图找到治愈孤独和痛苦的良方。这时,他遇到一只渴望被驯养的狐狸,于是奇妙而令人惊叹的事情发生了",
  "price": 26.5
}

v2.0版本推送数据样例:

{
  "name": "小王子",
  "author": "安托万·德·圣-埃克苏佩里(1900-1944)",
  "content": "遥远星球上的小王子,与美丽而骄傲的玫瑰吵架负气出走,在各星球漫游中,小王子遇到了傲慢的国王,一个任性的酒鬼,一个唯利是图的商人,一个死守教条的地理学家,而后来到地球上,试图找到治愈孤独和痛苦的良方。这时,他遇到一只渴望被驯养的狐狸,于是奇妙而令人惊叹的事情发生了",
  "detailinfo": {
    "published house": " 浙江文艺出版社",
    "published date": "2017-02-01",
    "commodity code": "12157218",
    "number of pages": 208
  },
  "Price": 26.5,
  "platform": "京东"
}

为了方便diff出两个版本的数据差异,需要先对字典数据进行排序

二、需求

如何用Python3实现一个嵌套字典排序?

三、实现

3.1 实现思路
  1. 自己编程实现:呃呃~,对于一个菜鸟测试人员来说,这不是为难我嘛
  2. 搜索引擎上查查资料: 搜索结果五花八门,看着头大
  3. ChatGPT: 听说ta写代码能力很在行,今天试试看,说干就干
3.2 具体实现

流程图:

python多层嵌套字典取值 python嵌套字典读取_json

ChatGPT问答结果

python多层嵌套字典取值 python嵌套字典读取_开发语言_02

def recursive_dict_sort(dictionary):
    if isinstance(dictionary, dict):
        return {k: recursive_dict_sort(v) for k, v in sorted(dictionary.items())}
    elif isinstance(dictionary, list):
        return [recursive_dict_sort(v) for v in dictionary]
    else:
        return dictionary

完整程序代码:

import json


def recursive_dict_sort(dictionary):
    if isinstance(dictionary, dict):
        return {k: recursive_dict_sort(v) for k, v in sorted(dictionary.items())}
    elif isinstance(dictionary, list):
        return [recursive_dict_sort(v) for v in dictionary]
    else:
        return dictionary


def read_data():
    with open('data_before_sort.json', 'r') as data_file:
        data = json.load(data_file)
    return data

if __name__ == '__main__':
    kafka_data =  read_data()
    res = recursive_dict_sort(kafka_data)
    res = json.dumps(res,indent=4, ensure_ascii=False)  #格式化json输出

    with open('data_after_sort.json', 'w', encoding='utf-8') as f:
        f.writelines(res)
    print(res)

四、效果

排序前diff:

python多层嵌套字典取值 python嵌套字典读取_开发语言_03


排序后diff:

python多层嵌套字典取值 python嵌套字典读取_python_04


进行diff,惊喜发现,price中的p字母,两个版本大小写不一致,喜提一个bug

五、收益

diff发现两个版本字母大小写不一致问题