Python实现JSON静态变量替换为列表元素的问题求助
解决JSON中静态变量替换为列表元素的问题
首先,你遇到的TypeError: unhashable type: 'list'看起来有点蹊跷,不过先不管这个——用正则表达式处理JSON结构其实是非常不稳妥的方案:如果你的JSON里其他字段碰巧也出现了"PARA"字符串,正则会不分青红皂白替换掉;而且一旦JSON格式有微小变化(比如空格、换行位置调整),正则很可能直接失效。更可靠的方式是直接解析JSON,修改对应字段后再转回JSON格式。
下面是具体的实现步骤和代码:
步骤说明
- 先把你提供的JSON片段转换成合法的JSON数组(原始内容是三个独立对象,需要用
[]包裹才能被json模块正常解析) - 用
json.loads()将JSON字符串转换成Python的列表对象 - 遍历列表中的每个字典,依次用目标列表里的元素替换
"parameter"字段的值 - 最后用
json.dumps()将修改后的Python对象转回JSON字符串
完整代码示例
import json # 原始JSON片段,先包裹成合法的数组 original_json_str = '''[ { "ignorecase": true, "parameter": "PARA", "type": "querystring" }, { "ignorecase": true, "parameter": "PARA", "type": "querystring" }, { "ignorecase": true, "parameter": "PARA", "type": "querystring" } ]''' # 要替换的元素列表 params = ['cd', 'pid', 'pod'] # 解析JSON为Python列表 data = json.loads(original_json_str) # 遍历并替换每个对象的parameter字段 for item, param in zip(data, params): item['parameter'] = param # 转回JSON字符串,indent参数用来格式化输出,可根据需求调整 result_json = json.dumps(data, indent=2) # 输出结果 print(result_json)
格式化输出结果
[ { "ignorecase": true, "parameter": "cd", "type": "querystring" }, { "ignorecase": true, "parameter": "pid", "type": "querystring" }, { "ignorecase": true, "parameter": "pod", "type": "querystring" } ]
如果你需要和你示例里完全一致的紧凑格式(去掉外层数组括号、用逗号直接分隔对象),可以在最后做一点字符串处理:
# 去掉外层的[],并整理成紧凑格式 compact_result = result_json.replace('[', '').replace(']', '').replace('\n', '').replace(' ', ' ') print(compact_result)
这样就能得到你期望的输出:
{ "ignorecase": true, "parameter": "cd", "type": "querystring" }, { "ignorecase": true, "parameter": "pid", "type": "querystring" }, { "ignorecase": true, "parameter": "pod", "type": "querystring" }
关于你原正则代码的错误
你贴的正则代码本身在Python2里应该是可以运行的,出现TypeError: unhashable type: 'list'大概率是运行时不小心把列表y用作了哈希表(比如字典的键)导致的。不过还是那句话,正则处理JSON是不推荐的方案,容易引入各种意外问题。
内容的提问来源于stack exchange,提问作者Kyleb27
相关产品推荐
相关产品推荐

