Java Gson http响应难解析

问题描述:

我想解析来自服务器的http json响应的大响应。创建响应文件的类是有害的,因为文件太大。我试着用GSON,但没有效果Java Gson http响应难解析

这里是响应http://www.sendspace.pl/file/ff7257d27380cf5e0c67a33

而且我的代码:

try { 
    JsonReader reader = new JsonReader(content); 
    JsonElement json = new JsonParser().parse(reader); 
    reader.beginObject(); 
    while (reader.hasNext()) { 
    String name = reader.nextName(); 
    if (name.equals("devices")) { 
     System.out.println("gfdd"); 
    } else { 
     reader.skipValue(); //avoid some unhandle events 
    } 
    } 
    reader.endObject(); 
    reader.close(); 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

我得到异常:

Exception in thread "main" java.lang.IllegalStateException: Expected BEGIN_OBJECT but was END_DOCUMENT at line 799 column 2 
    at com.google.gson.stream.JsonReader.expect(JsonReader.java:339) 
    at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:322) 
    at LightsControl.main(LightsControl.java:41) 
+0

JSON响应确实相当大,您是否要访问响应中的所有数据?在GSON中,你必须创建类来包装JSON响应,我可以向你解释如何,但它确实会“有害,因为文件太大”... – MikO 2013-04-10 14:20:54

为了解析您的JSON用GSON响应,你需要创建一些类到包装你的反应。

在你的情况,你应该有这样的:

public class Response { 

    @SerializedName("devices") 
    private List<Device> devices; 
    @SerializedName("scenes") 
    private List<Scene> scenes; 
    @SerializedName("sections") 
    private List<Section> sections; 
    //...other fields... 

    //getter and setter 
} 

然后:

public class Device{ 

    @SerializedName("id") 
    private String id; 
    @SerializedName("name") 
    private String name; 
    @SerializedName("device_type") 
    private String deviceType; 
    @SerializedName("device_file") 
    private String deviceFile; 
    @SerializedName("states") 
    private List<State> states; 
    //... other fields 

    //getters and setters 
} 

然后你要做的带班SceneSectionState等相同。 .. 显然它有点乏味,因为你的JSON响应很长,有许多不同的值...

好处是,如果你不需要它们,你可以轻松地跳过值。例如,如果你不需要检索设备的states,你可以从类Device删除属性states和GSON自动跳过这些价值观......

然后你只解析JSON与效应初探对象,如下所示:

String jsonString = "your json data..."; 
Gson gson = new Gson(); 
Response response = gson.fromJson(jsonString, Response.class);