发布于2026-07-08 阅读(0)
扫一扫,手机访问
说个在Ja va里处理JSON时挺常见的需求:项目里需要按某个路径动态提取数据,像这样的字符串"data.items[0].user.name",但标准库又不直接支持JSONPath。怎么办?自己上手用for循环配合org.json或Jackson,一步步手动解析和遍历,其实没那么复杂。关键思路是把路径字符串拆解成一串操作指令,然后逐层往下走——数组索引、对象字段,全由for循环控制。下面把核心环节拆开聊聊。

第一步,把混合点号和方括号的路径标准化成操作指令列表。举例说,"a.b[1].c"要变成["a", "b", 1, "c"]这样的结构。实现起来可以用正则或者简单的字符串分割加扫描:
split("\\.")拆出基础段[数字],有的话提取索引并转成整数,否则保留为key名List(混合String和Integer)这一步搞定,后续就按图索骥了。
从根JSON对象(JSONObject或JsonNode)出发,按路径段的顺序一路推进。遇到数组就用for循环遍历所有元素(或只取指定索引),遇到对象就用key取子节点。具体逻辑如下:
"items"),直接调用get(key)获取子节点get(i)取第i项;如果路径里用了通配符(如"items[*].name"),那就用for遍历整个数组instanceof JSONObject / JSONArray),避免运行时抛异常这一步是核心,循环嵌套循环,但逻辑很清晰。
当路径里出现通配符,比如"users[*].email"或者"logs..message",就需要扩展一下处理逻辑:用for主动展开数组、递归进入对象,把符合条件的值全部收集起来。举个例子:
[*] → 对当前JSONArray执行for (int i = 0; i < arr.length(); i++)..(深层搜索)→ 用递归加for遍历对象所有key,对每个value判断是否匹配目标keyList,避免只返回第一个匹配项这样一通下来,多结果提取也稳稳拿下。
实际项目中更推荐用Jackson的JsonNode,它天然支持不可变遍历和类型安全访问。核心流程依然依赖for:
node.at("/path/to/key")可以快速定位(内部已封装路径解析),但如果想自定义路径解析,还是得手动走:比如node.path("data").path("items").get(0).path("user").path("name").asText()for (JsonNode item : arrayNode)遍历,再对每个item提取子字段extract(JsonNode root, List方法,内部用for处理每个segment整体逻辑不复杂,但容易忽略类型转换和空值保护——每一步获取后建议用isNull()或isMissingNode()判空,避免NPE。这一点是实战中踩过坑才总结出来的经验。