如何使用JavaScript替换JSON结构中的所有值(含数组对象映射)
实现JSON指定层级值到带索引参数占位符的替换
我来帮你搞定这个需求——看起来你需要保留外层resources数组里的name和type原始值,只替换properties下的所有值,其中对象数组要生成带索引的占位符格式。下面是具体的实现步骤和代码:
需求拆解
- 对于普通键值对(比如
zone: "asia"):替换为{param.keyName},即zone变成{param.zone} - 对于对象数组(比如
disks数组):每个元素的键值对要生成{param.arrayName[index]_keyName}格式,比如第0个元素的name变成{param.disks0_name}
Python实现代码
import json def replace_with_params(obj, prefix="param"): if isinstance(obj, list): # 处理对象数组,遍历每个元素并添加索引 result = [] for idx, item in enumerate(obj): if isinstance(item, dict): processed_item = {} for key, val in item.items(): # 生成 {prefix.arrayName[idx]_key} 格式的占位符 processed_item[key] = f"{{{prefix}.{obj.array_key}{idx}_{key}}}" result.append(processed_item) return result elif isinstance(obj, dict): result = {} for key, val in obj.items(): if isinstance(val, list): # 给数组标记对应的键名,方便生成占位符时使用 val.array_key = key result[key] = replace_with_params(val, prefix) else: # 普通值生成 {prefix.key} 格式的占位符 result[key] = f"{{{prefix}.{key}}}" return result # 你的原始JSON数据 original_json = '''{"resources": [{"name": "prod","type": "local","properties": {"zone": "asia","disks": [{"sizeGb": 3,"diskType": "boot","name": "backup"},{"sizeGb": 4,"diskType": "ssd","name": "cache"}]}}]}''' data = json.loads(original_json) # 只处理properties层级的内容(保留外层的name和type) data['resources'][0]['properties'] = replace_with_params(data['resources'][0]['properties']) # 输出处理后的JSON print(json.dumps(data, indent=2))
运行结果
执行代码后,你会得到符合需求的输出(修正了示例里的笔误,第二个磁盘的sizeGb应该是{param.disks1_sizeGb}而不是{param.disks1_zone}):
{ "resources": [ { "name": "prod", "type": "local", "properties": { "zone": "{param.zone}", "disks": [ { "sizeGb": "{param.disks0_sizeGb}", "diskType": "{param.disks0_diskType}", "name": "{param.disks0_name}" }, { "sizeGb": "{param.disks1_sizeGb}", "diskType": "{param.disks1_diskType}", "name": "{param.disks1_name}" } ] } } ] }
扩展说明
如果需要替换整个JSON的所有值(包括外层的name和type),只需要把调用改成:
processed_data = replace_with_params(data)
这样外层的name会变成{param.resources0_name},type变成{param.resources0_type},符合你描述的“所有值替换”规则。
内容的提问来源于stack exchange,提问作者Ayush Rawat
相关产品推荐
相关产品推荐

