这可能是一个愚蠢的问题,但在java中,从url读取和解析json的最简单方法是什么?在groovy中,只需要几行代码。我发现的java示例非常长(并且有巨大的异常处理块)。我想做的就是阅读这个链接的内容。
zc0qhyus1#
下面是如何解析json内容的完整示例。这个例子以android版本统计数据为例(可以从androidstudio源代码中找到,链接到这里)。将从那里得到的“distributions.json”文件复制到res/raw中,作为备用。构建.gradle
implementation 'com.google.code.gson:gson:2.8.6'
显示
<uses-permission android:name="android.permission.INTERNET" />
主要活动.kt
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) if (savedInstanceState != null) return thread { // https://cs.android.com/android/platform/superproject/+/studio-master-dev:tools/adt/idea/android/src/com/android/tools/idea/stats/DistributionService.java var root: JsonArray Log.d("AppLog", "loading...") try { HttpURLConnection.setFollowRedirects(true) val statsUrl = "https://dl.google.com/android/studio/metadata/distributions.json" //just a string val url = URL(statsUrl) val request: HttpURLConnection = url.openConnection() as HttpURLConnection request.connectTimeout = 3000 request.connect() InputStreamReader(request.content as InputStream).use { root = JsonParser.parseReader(it).asJsonArray } } catch (e: Exception) { Log.d("AppLog", "error while loading from Internet, so using fallback") e.printStackTrace() InputStreamReader(resources.openRawResource(R.raw.distributions)).use { root = JsonParser.parseReader(it).asJsonArray } } val decimalFormat = DecimalFormat("0.00") Log.d("AppLog", "result:") root.forEach { val androidVersionInfo = it.asJsonObject val versionNickName = androidVersionInfo.get("name").asString val versionName = androidVersionInfo.get("version").asString val versionApiLevel = androidVersionInfo.get("apiLevel").asInt val marketSharePercentage = androidVersionInfo.get("distributionPercentage").asFloat * 100f Log.d("AppLog", "\"$versionNickName\" - $versionName - API$versionApiLevel - ${decimalFormat.format(marketSharePercentage)}%") } } }}
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
if (savedInstanceState != null)
return
thread {
// https://cs.android.com/android/platform/superproject/+/studio-master-dev:tools/adt/idea/android/src/com/android/tools/idea/stats/DistributionService.java
var root: JsonArray
Log.d("AppLog", "loading...")
try {
HttpURLConnection.setFollowRedirects(true)
val statsUrl = "https://dl.google.com/android/studio/metadata/distributions.json" //just a string
val url = URL(statsUrl)
val request: HttpURLConnection = url.openConnection() as HttpURLConnection
request.connectTimeout = 3000
request.connect()
InputStreamReader(request.content as InputStream).use {
root = JsonParser.parseReader(it).asJsonArray
}
} catch (e: Exception) {
Log.d("AppLog", "error while loading from Internet, so using fallback")
e.printStackTrace()
InputStreamReader(resources.openRawResource(R.raw.distributions)).use {
val decimalFormat = DecimalFormat("0.00")
Log.d("AppLog", "result:")
root.forEach {
val androidVersionInfo = it.asJsonObject
val versionNickName = androidVersionInfo.get("name").asString
val versionName = androidVersionInfo.get("version").asString
val versionApiLevel = androidVersionInfo.get("apiLevel").asInt
val marketSharePercentage = androidVersionInfo.get("distributionPercentage").asFloat * 100f
Log.d("AppLog", "\"$versionNickName\" - $versionName - API$versionApiLevel - ${decimalFormat.format(marketSharePercentage)}%")
作为依赖关系的替代方法,您也可以使用以下选项:
InputStreamReader(request.content as InputStream).use { val jsonArray = JSONArray(it.readText())}
val jsonArray = JSONArray(it.readText())
以及后备方案:
InputStreamReader(resources.openRawResource(R.raw.distributions)).use { val jsonArray = JSONArray(it.readText())}
运行此命令的结果:
loading...result:"Ice Cream Sandwich" - 4.0 - API15 - 0.20%"Jelly Bean" - 4.1 - API16 - 0.60%"Jelly Bean" - 4.2 - API17 - 0.80%"Jelly Bean" - 4.3 - API18 - 0.30%"KitKat" - 4.4 - API19 - 4.00%"Lollipop" - 5.0 - API21 - 1.80%"Lollipop" - 5.1 - API22 - 7.40%"Marshmallow" - 6.0 - API23 - 11.20%"Nougat" - 7.0 - API24 - 7.50%"Nougat" - 7.1 - API25 - 5.40%"Oreo" - 8.0 - API26 - 7.30%"Oreo" - 8.1 - API27 - 14.00%"Pie" - 9.0 - API28 - 31.30%"Android 10" - 10.0 - API29 - 8.20%
loading...
result:
"Ice Cream Sandwich" - 4.0 - API15 - 0.20%
"Jelly Bean" - 4.1 - API16 - 0.60%
"Jelly Bean" - 4.2 - API17 - 0.80%
"Jelly Bean" - 4.3 - API18 - 0.30%
"KitKat" - 4.4 - API19 - 4.00%
"Lollipop" - 5.0 - API21 - 1.80%
"Lollipop" - 5.1 - API22 - 7.40%
"Marshmallow" - 6.0 - API23 - 11.20%
"Nougat" - 7.0 - API24 - 7.50%
"Nougat" - 7.1 - API25 - 5.40%
"Oreo" - 8.0 - API26 - 7.30%
"Oreo" - 8.1 - API27 - 14.00%
"Pie" - 9.0 - API28 - 31.30%
"Android 10" - 10.0 - API29 - 8.20%
dddzy1tm2#
最简单的方法:使用gson,google自己的goto-json库。https://code.google.com/p/google-gson/这是一个样品。我要去这个免费的地理定位网站,解析json并显示我的zipcode(把这些东西放进一个主要的方法来测试)
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
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
vktxenjb3#
我想在这里添加一个更新的答案,因为最近对jdk的更新使得读取httpurl的内容更容易一些。正如其他人所说,您仍然需要使用json库来进行解析,因为jdk当前不包含json库。下面是一些最常用的java json库:组织.jsonfasterxmlJackson格森要从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());}
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'
ozxc1zmp4#
我发现这是迄今为止最简单的方法。使用此方法:
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; }
public static String getJSON(String url) {
HttpsURLConnection con = null;
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) {
} finally {
if (con != null) {
con.disconnect();
} catch (Exception ex) {
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"); } }
String json = getJSON(url);
JSONObject obj;
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");
of1yzvn45#
以下是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);
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);
其他lib如gson也支持单行方法;为什么许多例子显示更长的部分是奇怪的。更糟糕的是,许多示例使用过时的org.json库;这可能是第一件事,但有六个更好的替代品,所以很少有理由使用它。
djp7away6#
使用jersey客户端非常简单,只需包含以下maven依赖项:
<dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-client</artifactId> <version>2.25.1</version></dependency>
<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);
Gson gson = new Gson();
Type gm = new TypeToken<CoinDeskMessage>() {}.getType();
CoinDeskMessage cdm = gson.fromJson(json, gm);
yqyhoc1h7#
使用maven工件 org.json:json 我得到了下面的代码,我认为它很短。不尽可能短,但仍然可用。
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")); }}
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 {
int cp;
while ((cp = rd.read()) != -1) {
sb.append((char) cp);
public static JSONObject readJsonFromUrl(String url) throws IOException, JSONException {
InputStream is = new URL(url).openStream();
BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
String jsonText = readAll(rd);
JSONObject json = new JSONObject(jsonText);
return json;
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"));
oiopk7p58#
使用httpclient获取url的内容。然后使用json.org中的库来解析json。我在许多项目中使用过这两个库,它们非常健壮并且使用简单。除此之外,您可以尝试使用facebook api java库。我在这方面没有任何经验,但在java中使用facebook api时,有一个关于堆栈溢出的问题。您可能希望将restfb视为库使用的一个好选择。
yhived7q9#
我不确定这是否有效,但这是可能的方法之一:从url读取json使用 url.openStream() 将内容读入字符串。用这个字符串构造一个json对象(详见json.org)
url.openStream()
JSONObject(java.lang.String source) Construct a JSONObject from a source JSON text string.
JSONObject(java.lang.String source)
Construct a JSONObject from a source JSON text string.
wbrvyc0a10#
我已经用最简单的方法完成了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 = "";// constructorpublic 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;}}
package com.inzane.shoapp.activity;
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 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
// 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) {
} catch (IOException e) {
BufferedReader reader = new BufferedReader(new InputStreamReader(
is, "iso-8859-1"), 8);
String line = null;
while ((line = reader.readLine()) != null) {
System.out.println(line);
json = sb.toString();
} catch (Exception e) {
Log.e("Buffer Error", "Error converting result " + e.toString());
// try parse the string to a JSON object
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对象时,只需调用这个类和活动类中的方法我的密码在这里
String url = "your url";JSONParser jsonParser = new JSONParser();JSONObject object = jsonParser.getJSONFromUrl(url);String content=object.getString("json key");
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”是键,“hi”是值这会将json值转换为字符串内容。
at0kjp5o11#
如果您不介意使用几个库,可以在一行中完成。包括apache commons ioutils和json.org库。
JSONObject json = new JSONObject(IOUtils.toString(new URL("https://graph.facebook.com/me"), Charset.forName("UTF-8")));
11条答案
按热度按时间zc0qhyus1#
下面是如何解析json内容的完整示例。这个例子以android版本统计数据为例(可以从androidstudio源代码中找到,链接到这里)。
将从那里得到的“distributions.json”文件复制到res/raw中,作为备用。
构建.gradle
显示
主要活动.kt
作为依赖关系的替代方法,您也可以使用以下选项:
以及后备方案:
运行此命令的结果:
dddzy1tm2#
最简单的方法:使用gson,google自己的goto-json库。https://code.google.com/p/google-gson/
这是一个样品。我要去这个免费的地理定位网站,解析json并显示我的zipcode(把这些东西放进一个主要的方法来测试)
vktxenjb3#
我想在这里添加一个更新的答案,因为最近对jdk的更新使得读取httpurl的内容更容易一些。正如其他人所说,您仍然需要使用json库来进行解析,因为jdk当前不包含json库。下面是一些最常用的java json库:
组织.json
fasterxmlJackson
格森
要从url检索json,这似乎是严格使用jdk类的最简单方法(但可能不是您希望对大型有效负载执行的操作),java 9介绍:https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/io/inputstream.html#readallbytes()
例如,使用gson库解析json
ozxc1zmp4#
我发现这是迄今为止最简单的方法。
使用此方法:
像这样使用:
of1yzvn45#
以下是jackson的两个备选版本(因为您可能需要多种方式来获取数据):
特别是通常(imo)处理java对象的情况,可以用一行代码:
其他lib如gson也支持单行方法;为什么许多例子显示更长的部分是奇怪的。更糟糕的是,许多示例使用过时的org.json库;这可能是第一件事,但有六个更好的替代品,所以很少有理由使用它。
djp7away6#
使用jersey客户端非常简单,只需包含以下maven依赖项:
然后使用以下示例调用它:
然后使用google的gson解析json:
yqyhoc1h7#
使用maven工件
org.json:json
我得到了下面的代码,我认为它很短。不尽可能短,但仍然可用。oiopk7p58#
使用httpclient获取url的内容。然后使用json.org中的库来解析json。我在许多项目中使用过这两个库,它们非常健壮并且使用简单。
除此之外,您可以尝试使用facebook api java库。我在这方面没有任何经验,但在java中使用facebook api时,有一个关于堆栈溢出的问题。您可能希望将restfb视为库使用的一个好选择。
yhived7q9#
我不确定这是否有效,但这是可能的方法之一:
从url读取json使用
url.openStream()
将内容读入字符串。用这个字符串构造一个json对象(详见json.org)
wbrvyc0a10#
我已经用最简单的方法完成了json解析器
这个类从url返回json对象
当您需要json对象时,只需调用这个类和活动类中的方法
我的密码在这里
这里的“json键”表示json文件中的键
这是一个简单的json文件示例
这里“json”是键,“hi”是值
这会将json值转换为字符串内容。
at0kjp5o11#
如果您不介意使用几个库,可以在一行中完成。
包括apache commons ioutils和json.org库。