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

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

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


当前回答

使用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.

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

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

以下是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个更好的选择,所以几乎没有理由使用它。

这很简单,使用jersey-client,只需要包含这个maven依赖:

<dependency>
  <groupId>org.glassfish.jersey.core</groupId>
  <artifactId>jersey-client</artifactId>
  <version>2.25.1</version>
</dependency>

然后使用下面的例子调用它:

String json = ClientBuilder.newClient().target("http://api.coindesk.com/v1/bpi/currentprice.json").request().accept(MediaType.APPLICATION_JSON).get(String.class);

然后使用谷歌的Gson来解析JSON:

Gson gson = new Gson();
Type gm = new TypeToken<CoinDeskMessage>() {}.getType();
CoinDeskMessage cdm = gson.fromJson(json, gm);

我发现这是迄今为止最简单的方法。

使用这个方法:

public static String getJSON(String url) {
        HttpsURLConnection con = null;
        try {
            URL u = new URL(url);
            con = (HttpsURLConnection) u.openConnection();

            con.connect();


            BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));
            StringBuilder sb = new StringBuilder();
            String line;
            while ((line = br.readLine()) != null) {
                sb.append(line + "\n");
            }
            br.close();
            return sb.toString();


        } catch (MalformedURLException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            if (con != null) {
                try {
                    con.disconnect();
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        }
        return null;
    }

像这样使用它:

String json = getJSON(url);
JSONObject obj;
   try {
         obj = new JSONObject(json);
         JSONArray results_arr = obj.getJSONArray("results");
         final int n = results_arr.length();
            for (int i = 0; i < n; ++i) {
                // get the place id of each object in JSON (Google Search API)
                String place_id = results_arr.getJSONObject(i).getString("place_id");
            }


   }