JsonReader在数组末尾停止读取

时间:2018-09-10 02:31:43

标签: java gson

我正在编写用于生成包装箱的Spigot插件。该JsonReader扫描宝藏库文件以查找我请求的特定设置。问题是,我不想一遍又一遍地循环复制相同的内容,所以我决定这样做。

它成功读取了前六个令牌,但在令牌第六(“ max-axis”数组停止)处停止。那里没有逗号。当我在数组中添加第四个数字时,它甚至会读取它,但由于该位置没有逗号,因此停止在该数字上。使用JsonReader.setLenient(true),并使用JsonWriter.setLenient(true)写入文件。我尝试将writer设置为false。

编写此方法的方法很奇怪,但这仅用于测试。无需立即从文件中实际返回值。

PoolFile.scanDocument()

private Object scanDocument(JsonReader reader, Shell handleObj) {
    reader.setLenient(true);

    int retval = -2;
    try {
        JsonToken token = null; Object current = -5;

        while (reader.hasNext()) {
            token = reader.peek();
            //if (token == JsonToken.END_DOCUMENT) break;

            // Output while reading: 0 2 1 3 3 3
            switch(token) {
                case BEGIN_OBJECT:  reader.beginObject(); retval = 0; break;
                case BEGIN_ARRAY:   reader.beginArray(); retval = 1; break;
                case NAME:          current = reader.nextName(); retval = 2; break;
                case NUMBER:        current = reader.nextDouble(); retval = 3; break;
                case BOOLEAN:       current = reader.nextBoolean(); retval = 4; break;
                case STRING:        current = reader.nextString(); retval = 5; break;
                case END_ARRAY:     reader.endArray(); retval = 6; break;
                case END_OBJECT:    reader.endObject(); retval = 7; break;
                default:            reader.skipValue(); retval = -1;
            }

            handleObj.doWithJSONObject(token, retval);
        }
    } catch (IOException e) { retval = -1; e.printStackTrace(); }

    return retval;
}

defaultpool.json

{
    "max-axis": [
        50.0,
        -1.0,
        50.0 // It stops here.
    ],
    "pools": [
        {
            "label": "test",
            "items": {}
        }
    ]
}

EDIT 如果您想查看该应用程序,请visit the GitHub page。来源位于skycrates/src/main

1 个答案:

答案 0 :(得分:2)

问题是由于reader.hasNext()引起的。与其他Reader类进行比较时,此方法会产生误导。按照方法说明

  

/ **      *如果当前数组或对象具有另一个元素,则返回true。      * /

因此,当您使用完第一个数组中的所有元素后调用reader.hasNext()时。它将返回false并且循环结束。要解决此问题,请将条件改为while (reader.peek() != JsonToken.END_DOCUMENT)