Groovy处理超大JSON如何类似StAX解析仅提取目标对象属性
解决方案
命令行工具(无需编码)
直接使用轻量级JSON处理工具jq即可,它原生支持流式解析模式,无需全量加载JSON文件,内存占用稳定在MB级,完全不会触发OOM。
针对你的场景,提取a.b.c下id为some-key的对象的this属性,命令示例如下:
jq --stream 'fromstream(inputs | select((.[0][0] == "a" and .[0][1] == "b" and .[0][2] == "c") and (.[0][3] == "id" and .[1] == "some-key" or .[0][3] == "this"))) | .this' 你的大文件路径.json
流式处理模式会自动跳过体积庞大的d、e子树,仅解析匹配路径的目标节点,哪怕JSON文件达到GB级也可以正常处理。
JVM生态工具(可集成到代码中)
如果需要把提取逻辑集成到Java/Groovy项目中,不需要自行编写解析器,直接使用Jayway JsonPath库即可,它底层基于Jackson流式解析器实现,会自动跳过不需要的大节点,无需全量加载文档。
首先引入依赖(Gradle示例):
implementation 'com.jayway.jsonpath:json-path:2.8.0'
提取代码示例:
import com.jayway.jsonpath.JsonPath import java.io.FileInputStream // 直接从文件输入流读取,全程不会加载全量JSON内容 def targetValue = JsonPath.read(new FileInputStream("你的大文件路径.json"), "\$.a.b.c[?(@.id == 'some-key')].this") println targetValue // 输出 is the field I want
内容的提问来源于stack exchange,提问作者Rob H
相关产品推荐
相关产品推荐

