从java中的URL读取json最简单的方法

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

在Groovy中,这是几行代码的问题。 我发现Java的例子是可笑的(并有巨大的异常处理块)。

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

使用Maven artifact org.json:json我得到了下面的代码,我认为它很短。 尽可能短,但仍然可用。

 package so4308554; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.net.URL; import java.nio.charset.Charset; import org.json.JSONException; import org.json.JSONObject; public class JsonReader { private static String readAll(Reader rd) throws IOException { StringBuilder sb = new StringBuilder(); int cp; while ((cp = rd.read()) != -1) { sb.append((char) cp); } return sb.toString(); } public static JSONObject readJsonFromUrl(String url) throws IOException, JSONException { InputStream is = new URL(url).openStream(); try { BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8"))); String jsonText = readAll(rd); JSONObject json = new JSONObject(jsonText); return json; } finally { is.close(); } } public static void main(String[] args) throws IOException, JSONException { JSONObject json = readJsonFromUrl("https://graph.facebook.com/19292868552"); System.out.println(json.toString()); System.out.println(json.get("id")); } } 

这里有几个替代版本与杰克逊 (因为有不止一种方式,你可能想要的数据):

  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库。 它可能是第一件事,但有好几种更好的选择,所以没有什么理由使用它。

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

这里是一个例子。 我要去这个免费的geolocator网站和解析json并显示我的邮政编码。 (只是把这东西放在一个主要的方法来测试出来)

  String sURL = "http://freegeoip.net/json/"; //just a string // Connect to the URL using java's native library URL url = new URL(sURL); HttpURLConnection request = (HttpURLConnection) 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. zipcode = rootobj.get("zip_code").getAsString(); //just grab the zipcode 

如果你不介意使用一对夫妇图书馆,可以在一行中完成。

包括Apache Commons IOUtils & json.org库。

 JSONObject json = new JSONObject(IOUtils.toString(new URL("https://graph.facebook.com/me"), Charset.forName("UTF-8"))); 

使用HttpClient来获取URL的内容。 然后使用json.org的库来解析JSON。 我已经在很多项目中使用了这两个库,并且它们已经很强大而且使用简单。

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

我以最简单的方式完成了json解析器,在这里

 package com.inzane.shoapp.activity; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.json.JSONException; import org.json.JSONObject; import android.util.Log; public class JSONParser { static InputStream is = null; static JSONObject jObj = null; static String json = ""; // constructor public JSONParser() { } public JSONObject getJSONFromUrl(String url) { // Making HTTP request try { // defaultHttpClient DefaultHttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(url); HttpResponse httpResponse = httpClient.execute(httpPost); HttpEntity httpEntity = httpResponse.getEntity(); is = httpEntity.getContent(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } try { BufferedReader reader = new BufferedReader(new InputStreamReader( is, "iso-8859-1"), 8); StringBuilder sb = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line + "\n"); System.out.println(line); } is.close(); json = sb.toString(); } catch (Exception e) { Log.e("Buffer Error", "Error converting result " + e.toString()); } // try parse the string to a JSON object try { jObj = new JSONObject(json); } catch (JSONException e) { Log.e("JSON Parser", "Error parsing data " + e.toString()); System.out.println("error on parse data in jsonparser.java"); } // return JSON String return jObj; } } 

这个类从url返回json对象

当你想要json对象时,你只需要在Activity类中调用这个类和方法

我的代码在这里

 String url = "your url"; JSONParser jsonParser = new JSONParser(); JSONObject object = jsonParser.getJSONFromUrl(url); String content=object.getString("json key"); 

这里的“json键”表示在你的json文件中的键

这是一个简单的json文件示例

 { "json":"hi" } 

这里“json”是关键,“hi”是价值

这将得到你的JSON值字符串的内容。

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

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

用这个字符串构造一个JSON对象(更多在json.org )

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

使用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); 

然后使用Google的Gson来解析JSON:

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