这可能是一个愚蠢的问题,但是在Java中从URL读取和解析JSON的最简单的方法是什么?
在Groovy中,这只是几行代码的问题。我发现Java示例长得离谱(并且有巨大的异常处理块)。
我所要做的就是阅读这个链接的内容。
这可能是一个愚蠢的问题,但是在Java中从URL读取和解析JSON的最简单的方法是什么?
在Groovy中,这只是几行代码的问题。我发现Java示例长得离谱(并且有巨大的异常处理块)。
我所要做的就是阅读这个链接的内容。
当前回答
以下是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个更好的选择,所以几乎没有理由使用它。
其他回答
最简单的方法: 使用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个更好的选择,所以几乎没有理由使用它。
我想在这里添加一个更新的答案,因为最近对JDK的更新使读取HTTP URL的内容变得更容易了。 正如其他人所说,您仍然需要使用JSON库来进行解析,因为JDK目前还不包含JSON库。 下面是一些最常用的Java JSON库:
组织。杰伦 FasterXML Jackson 格森
要从URL检索JSON,这似乎是严格使用JDK类的最简单方法(但对于大型有效负载,可能不是您想要做的事情),Java 9介绍了:https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/io/InputStream.html#readAllBytes()
try(java.io.InputStream is = new java.net.URL("https://graph.facebook.com/me").openStream()) {
String contents = new String(is.readAllBytes());
}
例如,使用GSON库解析JSON
com.google.gson.JsonElement element = com.google.gson.JsonParser.parseString(contents); //from 'com.google.code.gson:gson:2.8.6'
使用Maven工件。我得到了以下代码,我认为这是相当短的。不是尽可能短,但仍然可用。
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"));
}
}
我发现这是迄今为止最简单的方法。
使用这个方法:
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");
}
}