【问题标题】:How to read subclass JSON with GSON如何使用 GSON 读取子类 JSON
【发布时间】:2020-12-24 23:57:38
【问题描述】:

这是我的代码,我可以得到像状态这样的字符串,但是例如“代理”我不能,因为它在“8.8.8.8”之内,我的问题是,我怎样才能用 GSON 获得“代理”的值.

{
    "status": "ok",
    "8.8.8.8": {
        "asn": "AS15169",
        "provider": "Google LLC",
        "continent": "North America",
        "country": "United States",
        "isocode": "US",
        "latitude": 37.751,
        "longitude": -97.822,
        "proxy": "no",
        "type": "Business"
    }
}
    public static void main(String[] args) {

        URL url = null;

        try {
            url = new URL("https://proxycheck.io/v2/8.8.8.8?vpn=1&asn=1&tag=proxycheck.io");
            URLConnection request = url.openConnection();
            request.connect();

            JsonParser jp = new JsonParser();

            JsonElement root = jp.parse(new InputStreamReader((InputStream) request.getContent()));
            System.out.println(root);

            JsonObject rootobj = root.getAsJsonObject();

            JsonElement proxy = rootobj.get("8.8.8.8");
            System.out.println(proxy);

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

【问题讨论】:

  • 我相信您需要创建一个具有相同字段的自定义对象(实例字段名称必须与我相信的键相同),并且您可以将对象的类传递给 GSON,它解析并返回提供的对象
  • 如果您只想从8.8.8.8 对象中选择一个值,那么您可以深入研究该对象。从您现有的rootobj 开始,您可以使用:String proxy = rootobj.get("8.8.8.8").getAsJsonObject().get("proxy").getAsString();。话虽如此,我同意@Sal 的观点,即创建反映 JSON 形状的 POJO 通常会更好。这样您就可以更轻松地访问任何 POJO 属性。

标签: java gson


【解决方案1】:

您可以从该 JSON 对象中获取“8.8.8.8”中的“代理”字段,如下所示:

JsonObject rootobj = root.getAsJsonObject();
JsonElement network = rootobj.get("8.8.8.8");
String proxy = network.getAsJsonObject().get("proxy").getAsString();
System.out.println(proxy);

返回:

没有

完整示例:

import java.net.URL;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

public class Main {
    public static void main(String[] args) {
            String jsonString = "{"
                    + "    \"status\": \"ok\","
                    + "    \"8.8.8.8\": {"
                    + "        \"asn\": \"AS15169\","
                    + "        \"provider\": \"Google LLC\","
                    + "        \"continent\": \"North America\","
                    + "        \"country\": \"United States\","
                    + "        \"isocode\": \"US\","
                    + "        \"latitude\": 37.751,"
                    + "        \"longitude\": -97.822,"
                    + "        \"proxy\": \"no\","
                    + "        \"type\": \"Business\""
                    + "    }"
                    + "}";
            JsonParser jp = new JsonParser();

            JsonElement root = jp.parseString(jsonString);
            System.out.println(root);

            JsonObject rootobj = root.getAsJsonObject();

            JsonElement network = rootobj.get("8.8.8.8");
            String proxy = network.getAsJsonObject().get("proxy").getAsString();
            System.out.println(proxy);
    }
}

【讨论】:

    【解决方案2】:
            String str = "{\"status\":\"ok\",\"8.8.8.8\":{\"asn\":\"AS15169\",\"provider\":\"Google LLC\",\"continent\":\"North America\",\"country\":\"United States\",\"isocode\":\"US\",\"latitude\":37.751,\"longitude\":-97.822,\"proxy\":\"no\",\"type\":\"Business\"}}";
            JsonObject jsonObject = new JsonParser().parse(str).getAsJsonObject();
            JsonObject data = jsonObject.getAsJsonObject("8.8.8.8");
            String proxy = data.get("proxy").getAsString();
            System.out.println(proxy);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-04
      • 2015-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多