如何用元组实现动态嵌套JSON结构?解决json.dump键报错
解决动态路径创建嵌套JSON结构的问题
这个问题我之前踩过坑!你遇到的TypeError根源很明确:JSON规范只允许字符串作为键,虽然Python字典支持用元组当键,但json.dump序列化时会严格校验键的类型,元组不符合要求就会报错。
直接用item[path] = "somevalue"的问题在于,你把整个元组('a','b','c')当成了字典的一个顶级键,而不是把它拆解成逐层嵌套的键,这显然不是你想要的效果。
正确实现方案:逐层构建嵌套字典
我们可以写一个简单的辅助函数,遍历路径中的每个键,逐层创建嵌套字典,最后设置目标值:
import json import sys def set_nested_dict_value(target_dict, key_path, value): current_level = target_dict # 遍历路径中除最后一个键之外的所有层级 for key in key_path[:-1]: # 如果当前键不存在,就创建一个空字典作为值 current_level = current_level.setdefault(key, {}) # 给最后一层的键赋值 current_level[key_path[-1]] = value # 用法示例 item = {} path = ('a', 'b', 'c') set_nested_dict_value(item, path, 'somevalue') # 序列化测试,现在不会报错了 json.dump(item, sys.stdout)
代码解释
setdefault(key, {}):这个方法会检查当前字典中是否存在指定键,如果不存在就创建它并赋值为空字典,同时返回这个字典;如果存在则直接返回对应的值,完美帮我们逐层构建嵌套结构。- 遍历
key_path[:-1]:只处理前n-1个键,最后一个键用来直接赋值,避免多创建一层无用的字典。
运行这段代码后,item的结构就是你想要的{'a': {'b': {'c': 'somevalue'}}},用json.dump序列化也完全符合JSON规范,不会再触发类型错误。
内容的提问来源于stack exchange,提问作者user9655163
相关产品推荐
相关产品推荐

