Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java解析大型json_Java_Json_Parsing_Openstreetmap - Fatal编程技术网

Java解析大型json

Java解析大型json,java,json,parsing,openstreetmap,Java,Json,Parsing,Openstreetmap,我想从OSM服务器解析json文件。它可能从几Kbs到10-20 Mbs不等。我现在正在使用GSON,但在解析大文件(比如10mbs)时,我面临一些性能问题。在流模式下进行解析仅需约10秒: JsonReader reader = new JsonReader(new StringReader(data)); try { reader.beginObject(); while(reader.hasNext()){ String na

我想从OSM服务器解析json文件。它可能从几Kbs到10-20 Mbs不等。我现在正在使用GSON,但在解析大文件(比如10mbs)时,我面临一些性能问题。在流模式下进行解析仅需约10秒:

JsonReader reader = new JsonReader(new StringReader(data));
    try {
        reader.beginObject();
        while(reader.hasNext()){
            String name = reader.nextName();
            if(name.equals("elements")){
                reader.beginArray();
                while(reader.hasNext()){
                    String type = null;
                    Long id = 0L;
                    Double lat = 0D;
                    Double lon = 0D;
                    ArrayList<Long> nodes = new ArrayList<>();
                    Tags tags = null;
                    reader.beginObject();
                    while(reader.hasNext()) {
                        name = reader.nextName();
                        switch (name) {
                            case "type":
                                type = reader.nextString();
                                break;
                            case "tags":
                                reader.beginObject();
                                while (reader.hasNext()) {
                                    name = reader.nextName();
                                    if (name.equals("highway"))
                                        tags = new Tags(reader.nextString());
                                    else
                                        reader.skipValue();
                                }
                                reader.endObject();
                                break;
                            default:
                                reader.skipValue();
                                break;
                        }
                    }
                    reader.endObject();
                }
                reader.endArray();
            }
            else{
                reader.skipValue();
            }
        }
        reader.endObject();
        reader.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
JsonReader=newjsonreader(newstringreader(data));
试一试{
reader.beginObject();
while(reader.hasNext()){
字符串名称=reader.nextName();
if(name.equals(“元素”)){
reader.beginArray();
while(reader.hasNext()){
字符串类型=null;
长id=0L;
双lat=0D;
双lon=0D;
ArrayList节点=新的ArrayList();
Tags=null;
reader.beginObject();
while(reader.hasNext()){
name=reader.nextName();
交换机(名称){
案例“类型”:
type=reader.nextString();
打破
案例“标签”:
reader.beginObject();
while(reader.hasNext()){
name=reader.nextName();
如果(名称等于(“公路”))
tags=新标记(reader.nextString());
其他的
reader.skipValue();
}
reader.endObject();
打破
违约:
reader.skipValue();
打破
}
}
reader.endObject();
}
reader.endArray();
}
否则{
reader.skipValue();
}
}
reader.endObject();
reader.close();
}捕获(IOE异常){
e、 printStackTrace();
}

目前,它是我的应用程序的瓶颈。我已经尝试了其他一些库,但没有任何改进。有没有什么我做错了,或者有没有什么特殊的方法来解析大型json数据?

json不是为快速解析而设计的(并且不是通常为OSM提供的文件类型)。也许你应该看看。虽然它是压缩的,但解析速度应该比JSON快

或者,不要重新发明轮子,而是使用诸如或之类的工具来解析OSM PBF或XML


另一个解决方案是为您感兴趣的确切元素类型创建请求。这样做的好处是,您要分析的文件只包含相关数据。

也许您想告诉我们您要实现的目标。也许有更好的办法。在JS中解析原始OSM数据听起来是错误的。这是Java而不是JS。我想从给定区域的OSM中获取道路类型和一些其他基本数据。我正在使用OverpassAPI来获取唯一感兴趣的数据。感谢您提供有关PBF格式的信息。这可能是一个解决办法。