在解析JSON

时间:2015-12-15 09:38:57

标签: java json

为了找出天气,JSON元素是JSONArray或JSONObject类型,我在<0>错误时得到 Unexpected token END OF FILE。

我的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);

感谢。

4 个答案:

答案 0 :(得分:5)

您反复解析相同的Reader。第一个呼叫耗尽它,然后每个后续呼叫看到一个空流。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

好吧,当您尝试传递错误的路径时,可能会发生错误。

因此,请正确检查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");

答案 3 :(得分:0)

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

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