You need to enable JavaScript to run this app. 从深度不一致的结构化JSON中取值的最Pythonic实现方法
优惠活动
大模型
产品
解决方案
定价
更多

从深度不一致的结构化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.03 05:27:04