Python实现按键匹配用源JSON覆盖更新目标JSON文件值
实现目标
匹配两个JSON文件的共有键,用源JSON对应键的值覆盖目标JSON的同键值,全程保留目标JSON的原有键结构。
输入文件说明
- 源JSON文件(
source.json)内容:
{"CLIENT_CODE":"client-d", "ARM_SUBSCRIPTION_ID":"abced-edfgh-dk6dkk-97dke", "location":"easteurope"}
- 目标JSON文件(
target.json)内容:
{"CLIENT_CODE":"dummy", "ARM_SUBSCRIPTION_ID":"dummy", "prefix":"orp", "location":"westeurope", "address_space":"10.0.0.0/16", "aad_login_name":"abcd.onmicrosoft.com", "aad_login_object_id":"dummy", "aad_login_tenant_id":"dummy", "bastion_allocation_method":"Static", "bastion_sku_type":"premium", "kv_sku_name":"premium", "storage_account_tier":"Standard", "storage_account_replication_type":"LRS", "storage_account_kind":"StorageV2", "sql_pool_sku_name":"DW100C", "node_size_family":"MemoryOptimized"}
预期输出
保留target.json的所有原有键,仅将两文件共有的键值替换为source.json中的对应值,最终结果如下:
{"CLIENT_CODE":"client-d", "ARM_SUBSCRIPTION_ID":"abced-edfgh-dk6dkk-97dke", "prefix":"orp", "location":"easteurope", "address_space":"10.0.0.0/16", "aad_login_name":"abcd.onmicrosoft.com", "aad_login_object_id":"dummy", "aad_login_tenant_id":"dummy", "bastion_allocation_method":"Static", "bastion_sku_type":"premium", "kv_sku_name":"premium", "storage_account_tier":"Standard", "storage_account_replication_type":"LRS", "storage_account_kind":"StorageV2"}
排查过程
- 初版代码缺陷
初版代码添加了if dataset1.keys() == dataset2.keys()判断,要求两个JSON的键完全一致才会执行更新,由于两个文件键集合不匹配,最终没有任何输出。初版代码如下:
import json with open("D:\ABTest\source.json", encoding='utf-8') as f: dataset1 = json.loads(f.read()) #print(dataset1) with open("D:\ABTest\\target.json", encoding='utf-8') as f: dataset2 = json.loads(f.read()) #print(dataset2) if dataset1.keys() == dataset2.keys(): dataset2.update(dataset1) print(dataset2)
- 调整后版本的局限
修改逻辑为遍历源JSON的所有键,判断键存在于目标JSON时就覆盖对应值,此时可以将合并结果写入第三个文件combined.json,但无法直接更新原target.json文件。调整后的代码如下:
import json with open("D:\ABTest\source.json", encoding='utf-8') as f: d1 = json.loads(f.read()) with open("D:\ABTest\\target.json", encoding='utf-8') as f: d2 = json.loads(f.read()) for key in d1.keys(): if key in d2.keys(): d2[key] = d1[key] print(d2) with open('D:\ABTest\combined.json', 'w', ) as f: json.dump(d2, f, ensure_ascii=False, indent=4)
更新:已成功实现完整功能,可用的工作代码已同步发布到回答区。
内容的提问来源于stack exchange,提问作者asp
相关产品推荐
相关产品推荐

