java - JsonReader 在数组末尾停止读取

标签 java gson

我正在为生成 crate 编写一个 Spigot 插件。此 JsonReader 扫描宝藏池文件以查找我请求的特定设置。事情是,我不想一遍又一遍地复制相同的 while 循环,所以我决定做这个。

它成功读取了前六个标记,但它在标记 6 处停止,“最大轴”数组在此处停止。那里没有逗号。当我向数组添加第四个数字时,它甚至会读取它,但停在该数字处,因为那里没有逗号。使用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;
}

默认池.json

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

编辑 如果您想查看该应用程序,visit the GitHub page .源位于 skycrates/src/main

最佳答案

问题是由于reader.hasNext()。与其他 Reader 类相比,此方法具有误导性。按照方法说明

/** * Returns true if the current array or object has another element. */

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

关于java - JsonReader 在数组末尾停止读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52250346/

相关文章:

java - 使用 JDT 解析工作区时出现错误 "Workspace is closed"

java - 如何指示一个 Class 对象应该代表一个接口(interface)的子类型?

java - Gson反序列化json,其中包含可以是字符串或对象的参数

android - 三星设备上的 Proguard "Missing type parameter"

java - "Can' t 为基本名称消息找到包”错误

java - Android:在我的工作区中使用来自另一个项目的资源

java - 时间戳字段的自定义打印

android - 使用 Gson 反序列化复杂的 JSON(几个嵌套元素)

使用 Kotlin 进行 Gson 反序列化,未调用初始化程序 block

java.lang.RuntimeException : Unable to invoke no-args constructor for class DBExecuter. Queryjson$valIOConfigclass