从深度不一致的结构化JSON中取值的最Pythonic实现方法
对话文本取值函数的方案评估
你当前选用的可变长路径方案是适配现有场景的合理选择
对比之前评估过的所有方案,这个实现没有过度设计、也没有为了省事埋长期维护的坑,完全匹配你描述的JSON结构特点:
- 调用时完全按照实际存储的路径传参即可,不需要为特殊结构写分支逻辑:
- 取
responses/errors下的具体文本:按三层路径传参,例如调用dialog("!remind", "responses", "reminder", time=pastcommand.time, thing=pastcommand.message) - 取直接存储为字符串的
help文本:按两层路径传参,例如调用dialog("!remind", "help")
- 取
- 后续如果
help真的需要嵌套(比如拆分普通用户、管理员两个版本的帮助文本),不需要修改函数逻辑,直接在JSON里把help改成字典结构,调用时多传一层key即可,扩展性足够。
之前评估过的几个方案的实际问题
- 强制把
help包成单键字典统一深度:本质是为了适配函数的硬约束倒改数据结构,平白增加JSON维护成本,毕竟help本身就是单条文本,多包一层纯字典没有任何业务价值,你之前的判断是对的。 - 在函数里对
help分类做特殊判断:把结构的特殊性硬编码到函数逻辑中,后续如果出现其他短路径文本节点(比如指令的专属提示水印、权限不足的固定弹窗),就要不断叠加if分支,逻辑会越来越冗余。 - 用try/except兼容两种路径:看似灵活,实际上会把路径写错导致的KeyError全部吞掉,比如本来要找
!remind > responses > reminder,结果参数传错落到了!remind > help的节点上,兼容逻辑会直接把结果返回,掩盖了调用时的传参错误,后续调试成本很高。 - 引入
pandas.json_normalize做扁平化:这是给复杂结构化数据做宽表转换的工具,用来做简单的文本节点查找属于大炮打蚊子,引入第三方依赖的重量远大于实际收益。
可以在现有实现上补的小幅优化
- 遍历路径拿到最终值后,先判断值的类型:如果不是字符串,直接抛出带路径信息的明确报错,避免取到中间层字典时,直接调用
.format()抛出难以排查的原生错误。 - 遍历过程中遇到缺失的key时,把当前已经走过的完整路径拼到报错信息里,比如提示
"路径 !remind > responses 中不存在键 'reminder'",比原生的KeyError可读性高很多。
内容的提问来源于stack exchange,提问作者Tamzin
相关产品推荐
相关产品推荐

