Java的GSON http响应难以解析(Java Gson http response diffi

2019-10-18 00:30发布

我想分析来自服务器的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)

Answer 1:

为了解析与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
}

然后,你必须做相同的类SceneSectionState等等......显然这是一个有点乏味,因为你的JSON响应非常长有许多不同的值...

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

然后你只解析JSON与效应初探对象,就像这样:

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


文章来源: Java Gson http response difficult parsing