【问题标题】:Java Gson http response difficult parsingJava Gson http响应难解析
【发布时间】:2013-04-10 11:26:18
【问题描述】:

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

【问题讨论】:

  • JSON 响应确实很大,你想访问响应中的所有数据吗?在 GSON 中,您必须创建类来包装 JSON 响应,我可以向您解释如何,但它确实会“因为文件太大而有害”...

标签: java parsing gson


【解决方案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
}

然后你必须对 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多