排查嵌套JSON接口返回,我用JSONPath在线工具省了半天调试时间

上周接了个需求,后端同事返回的JSON结构深得像俄罗斯套娃。我本地用console.log一层层展开,眼睛都花了,还是找不到想要的字段。后来换了个思路,用一个在线JSONPath工具直接定位,十几分钟就把问题解决了。下面把过程记下来,给同样被嵌套JSON折磨的同学参考。

先说我踩的坑

那个接口返回大概长这样(简化后):

{"code":200,"data":{"items":[{"id":1,"metadata":{"tags":[{"name":"java","score":0.9},{"name":"spring","score":0.8}]}}]}}

我要做的是:把所有itemsmetadata.tagsscore大于0.85的name取出来。

以前我的做法是用浏览器控制台写一长串?.链式调用,或者复制到IDE里用代码片段跑。结构一复杂,不是漏了括号就是层级对不上。最烦的是有些字段名字还不一样,比如另一个接口叫tag_list而不是tags,调试成本直接翻倍。

JSONPath到底怎么用

JSONPath的语法和XPath有点像,核心是用$表示根节点,.[]取属性,*通配,..递归,[?(@...)]做过滤。

针对上面的例子,我要定位所有tags里的对象,可以这样写:

$.data.items[*].metadata.tags[*]

如果要过滤score大于0.85的,加上过滤表达式:

$.data.items[*].metadata.tags[?(@.score > 0.85)].name

把这段表达式丢进JSONPath在线工具,粘贴JSON,点一下查询,结果直接列出["java"],不需要再手动展开。

实际工作流

我现在处理这种嵌套JSON基本是三步:

  • 把接口返回的JSON复制到在线JSONPath工具的左侧面板;
  • 在右侧输入框里写表达式,边写边看匹配结果;
  • 确认路径没错后,把表达式抄进业务代码里。

比我在控制台里反复折叠节点快得多。尤其是字段名不确定的时候,我会先用$..tags这种递归写法,看看JSON里到底哪些节点叫tags,再细化路径。

一些容易写错的点

  • [?(@.score > 0.85)]里,@代表当前节点,过滤条件要用括号包起来;
  • 数组索引从0开始,[0][:3]这些切片语法大部分工具都支持;
  • 如果要取多个字段,可以用['name', 'score']这种多选语法,不过不同实现支持程度不一样,建议先用单个字段验证。

写在最后

这种小工具我一般不会专门装插件,打开网页就能用是最省事的。最近我查这类在线小工具时,常去一个叫工具派(https://gjupai.com/)的站,上面的JSONPath查询工具支持表达式高亮、JSON树形可视化,还能点击节点自动生成路径,省了不少手敲表达式的时间。如果你也经常和嵌套JSON打交道,可以收藏一下,下次调试时试试看。