【问题标题】:Read a simple JSON file with GSON JsonReader使用 GSON JsonReader 读取一个简单的 JSON 文件
【发布时间】:2021-12-09 00:45:58
【问题描述】:

我认为这很简单,但它不断在InvocationTargetException reader.hasNext() 崩溃。

    File jsonInputFile = new File(root + "/dicts/phrases.json");
    JsonReader reader = new JsonReader(new FileReader(jsonInputFile));
    while (reader.hasNext()) {
        System.out.println(reader.nextName());
    }

这到底有什么问题?尽管 json 文件只有一行,while 循环会一直持续下去。

【问题讨论】:

  • ....你能在 reader.hasNext() 之前关闭一个阅读器吗??
  • @Susan Mustafa 删除了reader.close();,但它并没有改变任何东西。我仍然在同一行上得到相同的 InvocationTargetException 错误。 while 循环是无限的,任何对 reader.nextName() 的调用都会引发错误。
  • 您能粘贴您的 json 的一部分吗?您是否尝试过使用简单的 json...仅包含 1 个元素来查看是否是可能导致您出现问题的数据?
  • detailed information about the error 那么你能分享一下错误的细节吗?也许更容易理解问题的原因。
  • @BroscR Caused by: java.lang.IllegalStateException: Expected a name but was @BEGIN_OBJECT at line 1 column 2 path $ at com.google.gson@2.8.8/com.google.gson.stream.JsonReader.nextName(JsonReader.java:788)

标签: java json jsonreader


【解决方案1】:

因为它似乎在读取 JSON 并且遇到 BEGIN_TOKEN 而不是 JsonToken.NAME 类型

你可以试试下面的:

           while (jsonReader.hasNext()) 
            {
                JsonToken nextToken = jsonReader.peek();
                 
                if (JsonToken.BEGIN_OBJECT.equals(nextToken)) {
 
                    jsonReader.beginObject();
 
                } else if (JsonToken.NAME.equals(nextToken)) {
 
                    String name = jsonReader.nextName();
                    System.out.println("Token KEY >>>> " + name);
 
                } else if (JsonToken.STRING.equals(nextToken)) {
 
                    String value = jsonReader.nextString();
                    System.out.println("Token Value >>>> " + value);
 
                } else if (JsonToken.NUMBER.equals(nextToken)) {
 
                    long value = jsonReader.nextLong();
                    System.out.println("Token Value >>>> " + value);
 
                } else if (JsonToken.NULL.equals(nextToken)) {
 
                    jsonReader.nextNull();
                    System.out.println("Token Value >>>> null");
                     
                } else if (JsonToken.END_OBJECT.equals(nextToken)) {
 
                    jsonReader.endObject();
 
                }
            }

【讨论】:

  • 啊哈!是的,这行得通。所以问题出在我没有正确阅读。
  • 很高兴我帮助了@Hasen
  • 是的,我现在一切正常,它按照文件中的顺序读取 json 文件,解决了JSONObject 系统的缺点。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-06
  • 1970-01-01
相关资源
最近更新 更多