Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.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 格森;如何处理结束文档?_Java_Gson - Fatal编程技术网

Java 格森;如何处理结束文档?

Java 格森;如何处理结束文档?,java,gson,Java,Gson,我为树状结构制作了一个自定义类型适配器。本人声明如下: ModelTypeAdapter adapter = new ModelTypeAdapter(); builder.registerTypeAdapter( MyObject.class, adapter); Gson gson = builder.create(); MyObject[] results = gson.fromJson(data, MyObject[].class); 类型适配器实现以下

我为树状结构制作了一个自定义类型适配器。本人声明如下:

    ModelTypeAdapter adapter = new ModelTypeAdapter();
    builder.registerTypeAdapter( MyObject.class, adapter);
    Gson gson = builder.create();
    MyObject[] results = gson.fromJson(data, MyObject[].class);
类型适配器实现以下方法:

@Override
public MyObject read(JsonReader reader) throws IOException {
    JsonToken token = reader.peek();
    if (token == JsonToken.END_DOCUMENT) {
        return null;
    }
    MyObject result = null;
    try {
        result = readNode(reader);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return result;
}
递归方法
readNode
完美地解析了数据字符串,但一旦到达
END\u DOCUMENT
,系统就会陷入一个无休止的循环中,因为它一直在重新解析
END\u DOCUMENT
标记

  • 关闭读卡器没有帮助,因为GSON开始抱怨
  • 尝试读取下一个标记(例如skipValue)也没有帮助

  • 我正在使用Gson 2.8。有人知道如何解决这个问题吗?

    所以我找到了问题的原因。我可以在解析以下字符串时重新创建问题:

    [{}]
    
    正如所发生的那样,Gsonbuilder开始处理数组,并在检测到BEGIN_对象(“{”)时调用我的ModelTypeAdapter。当ModelTypeAdapter处理END_数组(“]”)时,生成器被END_文档标记卡住了

    此外,我的readNode具有以下结构:

    while(!JsonToken.END_DOCUMENT.equals(token )) && jsonReader.hasNext() ) {
        token = jsonReader.peek();
        ...
    }
    
    这应该是:

    while(!completed && jsonReader.hasNext() ) {
        token = jsonReader.peek();
        ...
        completed = endOfMyObject( token );
    } 
    
    经验教训:在制作类型适配器时,请集中精力处理单个对象,而不是它可能是其中一部分的数组结构。不要检查循环中的END_文档,因为这将创建嵌套对象的问题


    当然,这一切都是有道理的。

    您好,我不会回答您的问题,而是建议您:1-显示您的readNode方法2-简化您的代码以供使用,而(jsonReader.hasNext(){}阅读更多关于jsonReader的内容显然,
    Read
    的调用方在收到null时不会做出反应。它应该这样做。