首页 > 解决方案 > Gson HTTP 响应对象

问题描述

我第一次使用 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\"

标签: javajsongson

解决方案


您可以使用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 值的字段,它将丢弃该值。这就是我们可以在这里使用的原则。

编辑:根据这个 SO question更改上面的答案以处理 JSON 数组。


推荐阅读