如何使用Python对比两个JSON文件并合并匹配的设备与组件数据?
如何使用Python对比两个JSON文件并合并匹配的设备与组件数据?
嘿,我仔细看了你的需求和代码,发现你的组件列表一直为空是因为循环逻辑和数据遍历的方式出了问题,咱们一步步来修正:
原代码的问题分析
- 循环嵌套顺序错误:你先遍历
assigned_components的每个条目,再遍历设备,这会导致同一个设备被重复添加到结果里,而且每次循环都重新初始化matched_components,很容易错过匹配项。 - 数据遍历逻辑有误:
assigned_components里的每个条目包含两部分(比如"Camera"和"data"),你遍历条目里的所有键时,当拿到"Camera"这类组件分类键时,它对应的字典里并没有data.rows,这时候component_rows是空的,自然匹配不到任何组件;只有data键对应的值里才有我们需要的rows数据,你之前的遍历方式把这部分逻辑搞混了。
修正后的代码
我们可以先把所有组件数据预处理成一个id到name的映射字典,这样匹配的时候效率更高,也不用反复嵌套循环:
def match_device_components(assigned_components, deployed_devices): # 先预处理:收集所有组件的id和对应name,存在字典里方便快速查找 component_id_map = {} for entry in assigned_components: # 每个entry里的data.rows才是我们需要的组件数据 component_rows = entry.get('data', {}).get('rows', []) for component in component_rows: component_id = component["id"] component_name = component["name"] component_id_map[component_id] = component_name # 用id做key,存对应的name matched_devices = [] for device in deployed_devices: device_asset_id = device["asset_id"] # 查找当前设备asset_id对应的组件name,找不到就返回空列表 matched_components = [] if device_asset_id in component_id_map: matched_components.append(component_id_map[device_asset_id]) # 组装匹配后的设备对象 matched_device = { "model_name": device["model_name"], "asset_tag": device["asset_tag"], "asset_id": device["asset_id"], "components": matched_components } matched_devices.append(matched_device) return matched_devices
代码说明
- 预处理组件映射:先遍历所有
assigned_components条目,提取每个data.rows里的组件id和name,存到字典里,这样后续查找只需要O(1)的时间。 - 匹配设备与组件:遍历每个设备,用它的
asset_id去映射字典里找对应的组件name,存在就添加到matched_components里,不存在就保持空列表(也可以根据需求改成其他默认值)。 - 组装结果:把设备信息和匹配到的组件列表组装成新对象,添加到结果列表里。
这样运行后,matched_devices里的components字段就会正确显示匹配到的组件名称啦~
备注:内容来源于stack exchange,提问作者Nico
相关产品推荐
相关产品推荐

