【问题标题】:Unexpected token END OF FILE at position 0 while parsing JSON解析 JSON 时在位置 0 出现意外的令牌 END OF FILE
【发布时间】:2015-12-15 09:38:56
【问题描述】:

为了找出 JSON 元素是 JSONArray 或 JSONObject 类型的天气,我收到 Unexpected token END OF FILE at position 0 错误。

我的 JSON 是:

{"colors":[{"color":"red","value":"#00"},{"color":"white","value":"#000g"}]}

我的代码是:

java.io.FileReader reader = new java.io.FileReader("jsonpath");
org.json.simple.parser.JSONParser parser = new JSONParser();
System.Out.Println("aaaaaa JSON Class: "+parser.parse(reader).getClass());
if(parser.parse(reader) instanceof org.json.simple.JSONArray)
    System.Out.Println("JSONArray");
else if(parser.parse(reader) instanceof org.json.simple.JSONObject)
    System.Out.Println("JSONObject");

当我运行上面的代码时,它会显示这个输出

aaaaaa JSON Class: class org.json.simple.JSONObject Unexpected token END OF FILE at popsition 0
at org.json.simple.parser.JSONParser(Unknown Source)
.
.
.
<rest of the exception>

我不明白为什么会发生此异常。 请帮帮我。

编辑后的更多细节:

我的这段代码在给定的 json 文件中运行良好:

java.io.FileReader reader = new java.io.FileReader("jsonpath");
org.json.simple.parser.JSONParser parser = new JSONParser();
org.json.simple.JSONObject object = (JSONObject)parser.parse(reader);
System.Out.Println("JSONObject: "+object);
org.json.simple.JSONArray array = (JSONArray)object.get("colors");
System.Out.Println("JSONArray: "+array);

以上代码的输出:

JSONObject: {"colors":[{"color":"red","value":"#00"},{"color":"white","value":"#000g"}]}
JSONArray: [{"color":"red","value":"#00"},{"color":"white","value":"#000g"}]

但我想在不知道 JSON 结构的情况下动态解析 JSON。 我想做这样的事情:

  if(json is object)
    JSONObject object = (JSONObject)parser.parse(reader);
  else if (json is array)
    JSONArray array = (JSONArray)parser.parse(reader);

谢谢。

【问题讨论】:

  • 看起来你在 json 前面有一个不可打印的字符
  • 如果不熟悉该库,我猜另一个可能的原因是您正在加载一个空文件。 (此外,您的输出不包含异常)。
  • 看起来你有一个空文件,不管你认为它包含什么。
  • @Jens,我认为没有任何不可打印的字符,因为我的另一个代码使用相同的 json 文件运行良好。我用更多细节编辑了我的帖子。
  • @Vulcan 我的文件不是空的。我用更多细节编辑了我的帖子。

标签: java json


【解决方案1】:

您重复解析相同的Reader。第一次调用会耗尽它,然后每个后续调用都会看到一个空流。

【讨论】:

  • 谢谢@Joe。是的,我不应该多次解析reader。它解决了我的问题。
【解决方案2】:

只解析一次阅读器。这是工作代码:

java.io.FileReader reader = new java.io.FileReader("jsonpath");
org.json.simple.parser.JSONParser parser = new JSONParser();
Object p = parser.parse(reader);
if(p instanceof org.json.simple.JSONArray){
    System.Out.Println("JSONArray");
    org.json.simple.JSONArray object = (JSONArray)p;
}
else if(p instanceof org.json.simple.JSONObject){
    System.Out.Println("JSONObject");
    org.json.simple.JSONObject object = (JSONObject)p;
}

以上代码的输出

JSONObject

【讨论】:

    【解决方案3】:

    好吧,当你尝试通过错误的路径时可能会发生错误。

    所以请正确检查您的 json 文件路径。首先尝试使用绝对路径。

    这是我的程序:

    private static void ReadWithEncoding(String filePath, String encoding) {
        StringBuilder json = new StringBuilder();
        File f = new File(filePath);
        if (f.exists() && f.isFile()) {
            try {
                BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(f), encoding));
                String line;
                while ((line = br.readLine()) != null) {
                    json.append(line);
                }
                br.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            System.out.println(json);
        }
    }
    

    对于 UTF8,您可以像这样运行它:

    ReadWithEncoding("D:/file.json", "UTF8");
    

    对于西里尔符号:

    ReadWithEncoding("D:/file.json", "Cp1251");
    

    【讨论】:

      【解决方案4】:

      我也收到此错误(“位置 0 处出现意外令牌结束文件。”)。 我在多个线程上使用了相同的 com.google.gson.Gson 和 org.json.simple.parser.JSONParser 实例。 现在我更改了代码并在每个线程上创建了这些的新实例,这解决了问题。

      gson = new GsonBuilder().create(); parser = new JSONParser();

      【讨论】:

        猜你喜欢
        • 2015-10-15
        • 2016-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-23
        • 2016-12-13
        • 1970-01-01
        相关资源
        最近更新 更多