这可能是一个愚蠢的问题,但是在Java中从URL读取和解析JSON的最简单的方法是什么?

在Groovy中,这只是几行代码的问题。我发现Java示例长得离谱(并且有巨大的异常处理块)。

我所要做的就是阅读这个链接的内容。


当前回答

Oracle文档描述了如何操作

一个HttpRequest被构建,然后 由HttpClient发送给URL

只需几行代码,通过使用Java类库。把这段代码放到你的main方法中:

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("http://example.com/"))
      .build();
client.sendAsync(request, BodyHandlers.ofString())
      .thenApply(HttpResponse::body)
      .thenAccept(System.out::println)
      .join();

响应由JSON对象{…},并可在您的申请中进一步处理。 在这里我把它打印到控制台,只是为了确认它是有效的:

System.out.println(request);

这可用于Java版本11+

其他回答

使用HttpClient获取URL的内容。然后使用来自json.org的库来解析JSON。我在许多项目中使用过这两个库,它们都很健壮,使用起来很简单。

除此之外,你可以尝试使用Facebook API java库。我在这方面没有任何经验,但有一个关于在java中使用Facebook API的堆栈溢出的问题。您可能希望将RestFB视为使用库的一个不错选择。

我不确定这是否有效,但这是一种可能的方法:

使用url. openstream()从url读取json,并将内容读入字符串。

用这个字符串构造一个JSON对象(更多信息请访问json.org)

JSONObject(java.lang.String source)
      Construct a JSONObject from a source JSON text string.

最简单的方法: 使用gson,谷歌自己的goto json库。https://code.google.com/p/google-gson/

这是一个样品。我到这个免费的地理定位器网站,解析json,显示邮政编码。(只要把这些东西放在主方法中测试就可以了)

    String sURL = "http://freegeoip.net/json/"; //just a string

    // Connect to the URL using java's native library
    URL url = new URL(sURL);
    URLConnection request = url.openConnection();
    request.connect();

    // Convert to a JSON object to print data
    JsonParser jp = new JsonParser(); //from gson
    JsonElement root = jp.parse(new InputStreamReader((InputStream) request.getContent())); //Convert the input stream to a json element
    JsonObject rootobj = root.getAsJsonObject(); //May be an array, may be an object. 
    String zipcode = rootobj.get("zip_code").getAsString(); //just grab the zipcode

以下是Jackson的几个替代版本(因为有不止一种方法你可能想要数据为):

  ObjectMapper mapper = new ObjectMapper(); // just need one
  // Got a Java class that data maps to nicely? If so:
  FacebookGraph graph = mapper.readValue(url, FaceBookGraph.class);
  // Or: if no class (and don't need one), just map to Map.class:
  Map<String,Object> map = mapper.readValue(url, Map.class);

特别是通常(IMO)的情况下,你想要处理Java对象,可以做成一行:

FacebookGraph graph = new ObjectMapper().readValue(url, FaceBookGraph.class);

其他库,如Gson也支持单行方法;为什么很多例子都显示了更长的部分,这很奇怪。更糟糕的是,许多例子使用了过时的org。json库;它可能是首选,但有6个更好的选择,所以几乎没有理由使用它。

Oracle文档描述了如何操作

一个HttpRequest被构建,然后 由HttpClient发送给URL

只需几行代码,通过使用Java类库。把这段代码放到你的main方法中:

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("http://example.com/"))
      .build();
client.sendAsync(request, BodyHandlers.ofString())
      .thenApply(HttpResponse::body)
      .thenAccept(System.out::println)
      .join();

响应由JSON对象{…},并可在您的申请中进一步处理。 在这里我把它打印到控制台,只是为了确认它是有效的:

System.out.println(request);

这可用于Java版本11+