2013-04-10 77 views
1

我想解析來自服務器的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

回答

0

爲了解析您的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);