
上周接了个需求后端同事返回的JSON结构深得像俄罗斯套娃。我本地用console.log一层层展开眼睛都花了还是找不到想要的字段。后来换了个思路用一个在线JSONPath工具直接定位十几分钟就把问题解决了。下面把过程记下来给同样被嵌套JSON折磨的同学参考。先说我踩的坑那个接口返回大概长这样简化后{code:200,data:{items:[{id:1,metadata:{tags:[{name:java,score:0.9},{name:spring,score:0.8}]}}]}}我要做的是把所有items里metadata.tags下score大于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打交道可以收藏一下下次调试时试试看。