Java 使用JSONPath迭代大型JSON数组

Java 使用JSONPath迭代大型JSON数组,java,arrays,json,parsing,jsonpath,Java,Arrays,Json,Parsing,Jsonpath,我有一个简单的Java应用程序,需要遍历一个大的JSON数组(大约有20K个项目),在每个数组中,我解析一个子数组。每个项目如下所示: {"index":0,"f1":[2,16,16,16,16,16,32,16],"f2":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

我有一个简单的
Java
应用程序,需要遍历一个大的
JSON
数组(大约有20K个项目),在每个数组中,我解析一个子数组。每个项目如下所示:

{"index":0,"f1":[2,16,16,16,16,16,32,16],"f2":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"startTime":0.0}
ArrayList<HashMap> json= JsonPath.read(response, "$.result");
我正在使用
JSONPath
对每个项目进行迭代。我首先读取长度,然后简单地迭代整个数组。但是它非常慢(比如,每秒1个项目)

int length=JsonPath.read(响应“$.result.length()”);
for(int i=0;i

有没有办法优化它?

明白了。多亏了Erwin,我可以一次将整个JSON解析为
HASHMap
,如下所示:

{"index":0,"f1":[2,16,16,16,16,16,32,16],"f2":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"startTime":0.0}
ArrayList<HashMap> json= JsonPath.read(response, "$.result");

您应该尽量减少
读取操作的次数。第一次扫描整个文件,然后扫描部分文件。从磁盘读取的速度比从内存读取的速度慢,因此您应该将文件加载到内存中一次,然后迭代项。此外,根据文件:

如果你只想读一次,这是可以的。以防你需要阅读 其他路径也是如此,因为文档将 每次调用JsonPath.read(…)时都会对其进行分析。为了避免这个问题 您可以先解析json


是-首先只将JSON文件解析为数据结构一次,然后访问数据结构。当前要做的是在每次从JSON中检索值时解析JSON,正如您所注意到的,这非常非常慢。请参阅
JSONPath
上的代码片段,了解更多详细信息。谢谢。是的,这就是我现在做的。现在的照明速度…难以置信@蒂纳吉,听到这个消息我很高兴。我们有更多的工具,而不仅仅是
JsonPath
,看看
Jackson
示例中的类似问题:。在这种情况下,我的答案是有帮助的看看神奇的答案@MichałZiober!
String json = "...";
Object document = Configuration.defaultConfiguration().jsonProvider().parse(json);

List<Integer> f10 = JsonPath.read(document, "$.result[0].f1");
List<Integer> f11 = JsonPath.read(document, "$.result[1].f1");
import com.jayway.jsonpath.JsonPath;

import java.io.File;
import java.util.List;
import java.util.Map;

public class JsonPathApp {

    public static void main(String[] args) throws Exception {
        File jsonFile = new File("./resource/test.json").getAbsoluteFile();
        List<Object> array = JsonPath.read(jsonFile, "$.result..['f1','startTime']");
        for (Object item : array) {
            Map<String, Object> map = (Map<String, Object>) item;
            System.out.println(map.get("f1"));
            System.out.println(map.get("startTime"));
        }
    }
}