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

cqoc49vn  于 2021-07-03  发布在  Java
关注(0)|答案(11)|浏览(456)

这可能是一个愚蠢的问题,但在java中,从url读取和解析json的最简单方法是什么?
在groovy中,只需要几行代码。我发现的java示例非常长(并且有巨大的异常处理块)。
我想做的就是阅读这个链接的内容。

zc0qhyus

zc0qhyus1#

下面是如何解析json内容的完整示例。这个例子以android版本统计数据为例(可以从androidstudio源代码中找到,链接到这里)。
将从那里得到的“distributions.json”文件复制到res/raw中,作为备用。
构建.gradle

  1. implementation 'com.google.code.gson:gson:2.8.6'

显示

  1. <uses-permission android:name="android.permission.INTERNET" />

主要活动.kt

  1. class MainActivity : AppCompatActivity() {
  2. override fun onCreate(savedInstanceState: Bundle?) {
  3. super.onCreate(savedInstanceState)
  4. setContentView(R.layout.activity_main)
  5. if (savedInstanceState != null)
  6. return
  7. thread {
  8. // https://cs.android.com/android/platform/superproject/+/studio-master-dev:tools/adt/idea/android/src/com/android/tools/idea/stats/DistributionService.java
  9. var root: JsonArray
  10. Log.d("AppLog", "loading...")
  11. try {
  12. HttpURLConnection.setFollowRedirects(true)
  13. val statsUrl = "https://dl.google.com/android/studio/metadata/distributions.json" //just a string
  14. val url = URL(statsUrl)
  15. val request: HttpURLConnection = url.openConnection() as HttpURLConnection
  16. request.connectTimeout = 3000
  17. request.connect()
  18. InputStreamReader(request.content as InputStream).use {
  19. root = JsonParser.parseReader(it).asJsonArray
  20. }
  21. } catch (e: Exception) {
  22. Log.d("AppLog", "error while loading from Internet, so using fallback")
  23. e.printStackTrace()
  24. InputStreamReader(resources.openRawResource(R.raw.distributions)).use {
  25. root = JsonParser.parseReader(it).asJsonArray
  26. }
  27. }
  28. val decimalFormat = DecimalFormat("0.00")
  29. Log.d("AppLog", "result:")
  30. root.forEach {
  31. val androidVersionInfo = it.asJsonObject
  32. val versionNickName = androidVersionInfo.get("name").asString
  33. val versionName = androidVersionInfo.get("version").asString
  34. val versionApiLevel = androidVersionInfo.get("apiLevel").asInt
  35. val marketSharePercentage = androidVersionInfo.get("distributionPercentage").asFloat * 100f
  36. Log.d("AppLog", "\"$versionNickName\" - $versionName - API$versionApiLevel - ${decimalFormat.format(marketSharePercentage)}%")
  37. }
  38. }
  39. }
  40. }

作为依赖关系的替代方法,您也可以使用以下选项:

  1. InputStreamReader(request.content as InputStream).use {
  2. val jsonArray = JSONArray(it.readText())
  3. }

以及后备方案:

  1. InputStreamReader(resources.openRawResource(R.raw.distributions)).use {
  2. val jsonArray = JSONArray(it.readText())
  3. }

运行此命令的结果:

  1. loading...
  2. result:
  3. "Ice Cream Sandwich" - 4.0 - API15 - 0.20%
  4. "Jelly Bean" - 4.1 - API16 - 0.60%
  5. "Jelly Bean" - 4.2 - API17 - 0.80%
  6. "Jelly Bean" - 4.3 - API18 - 0.30%
  7. "KitKat" - 4.4 - API19 - 4.00%
  8. "Lollipop" - 5.0 - API21 - 1.80%
  9. "Lollipop" - 5.1 - API22 - 7.40%
  10. "Marshmallow" - 6.0 - API23 - 11.20%
  11. "Nougat" - 7.0 - API24 - 7.50%
  12. "Nougat" - 7.1 - API25 - 5.40%
  13. "Oreo" - 8.0 - API26 - 7.30%
  14. "Oreo" - 8.1 - API27 - 14.00%
  15. "Pie" - 9.0 - API28 - 31.30%
  16. "Android 10" - 10.0 - API29 - 8.20%
展开查看全部
dddzy1tm

dddzy1tm2#

最简单的方法:使用gson,google自己的goto-json库。https://code.google.com/p/google-gson/
这是一个样品。我要去这个免费的地理定位网站,解析json并显示我的zipcode(把这些东西放进一个主要的方法来测试)

  1. String sURL = "http://freegeoip.net/json/"; //just a string
  2. // Connect to the URL using java's native library
  3. URL url = new URL(sURL);
  4. URLConnection request = url.openConnection();
  5. request.connect();
  6. // Convert to a JSON object to print data
  7. JsonParser jp = new JsonParser(); //from gson
  8. JsonElement root = jp.parse(new InputStreamReader((InputStream) request.getContent())); //Convert the input stream to a json element
  9. JsonObject rootobj = root.getAsJsonObject(); //May be an array, may be an object.
  10. String zipcode = rootobj.get("zip_code").getAsString(); //just grab the zipcode
vktxenjb

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()

  1. try(java.io.InputStream is = new java.net.URL("https://graph.facebook.com/me").openStream()) {
  2. String contents = new String(is.readAllBytes());
  3. }

例如,使用gson库解析json

  1. com.google.gson.JsonElement element = com.google.gson.JsonParser.parseString(contents); //from 'com.google.code.gson:gson:2.8.6'
ozxc1zmp

ozxc1zmp4#

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

  1. public static String getJSON(String url) {
  2. HttpsURLConnection con = null;
  3. try {
  4. URL u = new URL(url);
  5. con = (HttpsURLConnection) u.openConnection();
  6. con.connect();
  7. BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));
  8. StringBuilder sb = new StringBuilder();
  9. String line;
  10. while ((line = br.readLine()) != null) {
  11. sb.append(line + "\n");
  12. }
  13. br.close();
  14. return sb.toString();
  15. } catch (MalformedURLException ex) {
  16. ex.printStackTrace();
  17. } catch (IOException ex) {
  18. ex.printStackTrace();
  19. } finally {
  20. if (con != null) {
  21. try {
  22. con.disconnect();
  23. } catch (Exception ex) {
  24. ex.printStackTrace();
  25. }
  26. }
  27. }
  28. return null;
  29. }

像这样使用:

  1. String json = getJSON(url);
  2. JSONObject obj;
  3. try {
  4. obj = new JSONObject(json);
  5. JSONArray results_arr = obj.getJSONArray("results");
  6. final int n = results_arr.length();
  7. for (int i = 0; i < n; ++i) {
  8. // get the place id of each object in JSON (Google Search API)
  9. String place_id = results_arr.getJSONObject(i).getString("place_id");
  10. }
  11. }
展开查看全部
of1yzvn4

of1yzvn45#

以下是jackson的两个备选版本(因为您可能需要多种方式来获取数据):

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

特别是通常(imo)处理java对象的情况,可以用一行代码:

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

其他lib如gson也支持单行方法;为什么许多例子显示更长的部分是奇怪的。更糟糕的是,许多示例使用过时的org.json库;这可能是第一件事,但有六个更好的替代品,所以很少有理由使用它。

djp7away

djp7away6#

使用jersey客户端非常简单,只需包含以下maven依赖项:

  1. <dependency>
  2. <groupId>org.glassfish.jersey.core</groupId>
  3. <artifactId>jersey-client</artifactId>
  4. <version>2.25.1</version>
  5. </dependency>

然后使用以下示例调用它:

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

然后使用google的gson解析json:

  1. Gson gson = new Gson();
  2. Type gm = new TypeToken<CoinDeskMessage>() {}.getType();
  3. CoinDeskMessage cdm = gson.fromJson(json, gm);
展开查看全部
yqyhoc1h

yqyhoc1h7#

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

  1. package so4308554;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.InputStreamReader;
  6. import java.io.Reader;
  7. import java.net.URL;
  8. import java.nio.charset.Charset;
  9. import org.json.JSONException;
  10. import org.json.JSONObject;
  11. public class JsonReader {
  12. private static String readAll(Reader rd) throws IOException {
  13. StringBuilder sb = new StringBuilder();
  14. int cp;
  15. while ((cp = rd.read()) != -1) {
  16. sb.append((char) cp);
  17. }
  18. return sb.toString();
  19. }
  20. public static JSONObject readJsonFromUrl(String url) throws IOException, JSONException {
  21. InputStream is = new URL(url).openStream();
  22. try {
  23. BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
  24. String jsonText = readAll(rd);
  25. JSONObject json = new JSONObject(jsonText);
  26. return json;
  27. } finally {
  28. is.close();
  29. }
  30. }
  31. public static void main(String[] args) throws IOException, JSONException {
  32. JSONObject json = readJsonFromUrl("https://graph.facebook.com/19292868552");
  33. System.out.println(json.toString());
  34. System.out.println(json.get("id"));
  35. }
  36. }
展开查看全部
oiopk7p5

oiopk7p58#

使用httpclient获取url的内容。然后使用json.org中的库来解析json。我在许多项目中使用过这两个库,它们非常健壮并且使用简单。
除此之外,您可以尝试使用facebook api java库。我在这方面没有任何经验,但在java中使用facebook api时,有一个关于堆栈溢出的问题。您可能希望将restfb视为库使用的一个好选择。

yhived7q

yhived7q9#

我不确定这是否有效,但这是可能的方法之一:
从url读取json使用 url.openStream() 将内容读入字符串。
用这个字符串构造一个json对象(详见json.org)

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

wbrvyc0a10#

我已经用最简单的方法完成了json解析器

  1. package com.inzane.shoapp.activity;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.InputStreamReader;
  6. import java.io.UnsupportedEncodingException;
  7. import org.apache.http.HttpEntity;
  8. import org.apache.http.HttpResponse;
  9. import org.apache.http.client.ClientProtocolException;
  10. import org.apache.http.client.methods.HttpPost;
  11. import org.apache.http.impl.client.DefaultHttpClient;
  12. import org.json.JSONException;
  13. import org.json.JSONObject;
  14. import android.util.Log;
  15. public class JSONParser {
  16. static InputStream is = null;
  17. static JSONObject jObj = null;
  18. static String json = "";
  19. // constructor
  20. public JSONParser() {
  21. }
  22. public JSONObject getJSONFromUrl(String url) {
  23. // Making HTTP request
  24. try {
  25. // defaultHttpClient
  26. DefaultHttpClient httpClient = new DefaultHttpClient();
  27. HttpPost httpPost = new HttpPost(url);
  28. HttpResponse httpResponse = httpClient.execute(httpPost);
  29. HttpEntity httpEntity = httpResponse.getEntity();
  30. is = httpEntity.getContent();
  31. } catch (UnsupportedEncodingException e) {
  32. e.printStackTrace();
  33. } catch (ClientProtocolException e) {
  34. e.printStackTrace();
  35. } catch (IOException e) {
  36. e.printStackTrace();
  37. }
  38. try {
  39. BufferedReader reader = new BufferedReader(new InputStreamReader(
  40. is, "iso-8859-1"), 8);
  41. StringBuilder sb = new StringBuilder();
  42. String line = null;
  43. while ((line = reader.readLine()) != null) {
  44. sb.append(line + "\n");
  45. System.out.println(line);
  46. }
  47. is.close();
  48. json = sb.toString();
  49. } catch (Exception e) {
  50. Log.e("Buffer Error", "Error converting result " + e.toString());
  51. }
  52. // try parse the string to a JSON object
  53. try {
  54. jObj = new JSONObject(json);
  55. } catch (JSONException e) {
  56. Log.e("JSON Parser", "Error parsing data " + e.toString());
  57. System.out.println("error on parse data in jsonparser.java");
  58. }
  59. // return JSON String
  60. return jObj;
  61. }
  62. }

这个类从url返回json对象
当您需要json对象时,只需调用这个类和活动类中的方法
我的密码在这里

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

这里的“json键”表示json文件中的键
这是一个简单的json文件示例

  1. {
  2. "json":"hi"
  3. }

这里“json”是键,“hi”是值
这会将json值转换为字符串内容。

展开查看全部
at0kjp5o

at0kjp5o11#

如果您不介意使用几个库,可以在一行中完成。
包括apache commons ioutils和json.org库。

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

相关问题