我想解析来自服务器的 http json 响应的大响应。创建响应文件的类是有害的,因为文件太大。我尝试使用gson,但没有效果
这是回复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)
最佳答案
为了使用 GSON 解析您的 JSON 响应,您需要创建许多类来包装您的响应。
就您而言,您应该有类似的内容:
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
}
然后您必须对 Scene
、Section
、State
等类执行相同的操作...
显然这有点乏味,因为你的 JSON 响应很长,有很多不同的值......
好处是,如果不需要值,您可以轻松跳过它们。例如,如果您不需要检索设备的 states
,则只需从 Device
类中删除属性 states
即可GSON 自动跳过这些值...
然后您只需使用 Reponse 对象解析 JSON,如下所示:
String jsonString = "your json data...";
Gson gson = new Gson();
Response response = gson.fromJson(jsonString, Response.class);
关于Java Gson http响应解析困难,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15924550/