【问题标题】:Gson HTTP response objectGson HTTP 响应对象
【发布时间】:2018-11-27 19:23:51
【问题描述】:

我是第一次使用 Gson 库。我正在发出 HTTP 请求并拉取响应(JSON 响应)并且需要拉取特定结果。

StringBuilder response;
try (BufferedReader in = new BufferedReader( new InputStreamReader(connection.getInputStream()))) {
    String line;
    response = new StringBuilder();
    while((line = in.readLine()) != null) {
        response.append(line);
    }
}

Gson gson = new GsonBuilder()
                .setPrettyPrinting()
                .create();
System.out.println(gson.toJson(response));

响应如下所示,我只需拉取cardBackId

[{\"cardBackId\":\"0\",\"name\":\"Classic\",\"description\":\"The only card back you\u0027ll ever need.\",\"source\":\"startup\",\"sourceDescription\":\"Default\",\"enabled\":true,\"img\":\"http://wow.zamimg.com/images/hearthstone/backs/original/Card_Back_Default.png\",\"imgAnimated\":\"http://wow.zamimg.com/images/hearthstone/backs/animated/Card_Back_Default.gif\",\"sortCategory\":\"1\",\"sortOrder\":\"1\",\"locale\":\"enUS\"

【问题讨论】:

  • 您是否正在尝试将 JSON 字符串转换为对象?
  • gson.toJson(response) 正在拉动完整的响应。我只想拉“cardBackId”。
  • StringBuilder resp; try (BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()))) { String line; resp = new StringBuilder(); while((line = in.readLine()) != null) { resp.append(line); } }
  • toJson() 将对象转换为 JSON 字符串。 fromJson() 将 JSON 字符串转换为对象。

标签: java json gson


【解决方案1】:

您可以使用JSONPath(这是一个用于选择 JSON 对象部分的 Java 库)从字符串中仅提取您需要的部分。

或者,您可以编写一个只包含您想要的字段的类:

public class CardBackIdResponse {
    public int cardBackId;
}

然后使用 Gson 将 JSON 解组到您的对象中:

CardBackIdResponse[] cardBackIdResponses = gson.fromJson(response.toString(), CardBackIdResponse[].class);
System.out.println("cardBackId = " + cardBackIdResponses[0].cardBackId);

从 JSON 中解组对象时,如果 Gson 在对象中找不到要填充 JSON 值的字段,它将丢弃该值。这就是我们可以在这里使用的原则。

编辑:更改上述答案以按照this SO question 处理 JSON 数组。

【讨论】:

  • 更多关于如何使用 Gson 的文档:mkyong.com/java/…
  • 我在使用您建议的解决方案时收到以下错误。线程“主”com.google.gson.JsonSyntaxException 中的异常:java.lang.IllegalStateException:应为 BEGIN_OBJECT 但在第 1 行第 2 列路径 $ 处为 BEGIN_ARRAY
  • 编辑答案以处理 response 实际上是一个 JSON 数组。
  • 我能够解决。 CardResponse[] list = gson.fromJson(response.toString(), CardResponse[].class); System.out.println(gson.toJson(list[1]));
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
  • 2018-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多