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

Pom*_*ius 240 java url json

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

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

我想要做的就是阅读此链接的内容.

Rol*_*lig 187

使用Maven工件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"));
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 做什么的?然后`readLine`函数将执行循环,我必须连接行而不是字符,这更昂贵.这不会使代码像现在这样短.此外,在JSON表示法中没有"行"的概念,那么我为什么要这样读它们呢? (6认同)
  • 考虑Apache commons-io的`IOUtils.toString(InputStream)`方法.这应该可以为你节省一些线索和责任. (4认同)
  • 您可以在BufferedReader上使用readLine()而不是按字符读取字符.这将减少while循环的迭代次数. (3认同)
  • 为什么我收到此错误"构造函数JSONObject(String)未定义"在JSONObject json = new JSONObject(jsonText)行中; 在"readJsonFromUrl"方法..?@RolandIllig (3认同)
  • 对于GSON,Jackson,Boon,Genson和其他人,您只需要提供源:或者只是URL,或者最多是`InputStream`.虽然上面的代码可能是'org.json`用法的缩写,但请确保验证其他可用的库 - 不需要为此任务编写超过1-3行代码. (2认同)

Sta*_*Man 64

以下是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);
Run Code Online (Sandbox Code Playgroud)

特别是你想要处理Java对象的通常(IMO)情况,可以做成一个班轮:

FacebookGraph graph = new ObjectMapper().readValue(url, FaceBookGraph.class);
Run Code Online (Sandbox Code Playgroud)

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

  • 在上面的示例中_should_是java.net.URL,否则它将尝试将字符串“ http:// ....”解析为json,这将产生错误 (3认同)
  • 无法识别的令牌“https”:期待(“真”、“假”或“空”) (2认同)

use*_*569 58

最简单的方法:使用gson,谷歌自己的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);
    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
Run Code Online (Sandbox Code Playgroud)

  • 请添加 maven 依赖项 &lt;dependency&gt; &lt;groupId&gt;com.google.code.gson&lt;/groupId&gt; &lt;artifactId&gt;gson&lt;/artifactId&gt; &lt;version&gt;2.8.0&lt;/version&gt; &lt;/dependency&gt; 以在您的 pom 中获取 JsonParse文件。 (2认同)

ezw*_*ter 40

如果您不介意使用几个库,可以在一行中完成.

包括Apache Commons IOUtilsjson.org库.

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


Jon*_*der 6

使用HttpClient获取URL的内容.然后使用json.org中的库来解析JSON.我在很多项目中使用了这两个库,它们非常强大且易于使用.

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


小智 5

我以最简单的方式完成了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;

}
}
Run Code Online (Sandbox Code Playgroud)

此类从url返回json对象

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

我的代码在这里

String url = "your url";
JSONParser jsonParser = new JSONParser();
JSONObject object = jsonParser.getJSONFromUrl(url);
String content=object.getString("json key");
Run Code Online (Sandbox Code Playgroud)

这里"json key"表示你的json文件中的键

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

{
    "json":"hi"
}
Run Code Online (Sandbox Code Playgroud)

这里"json"是关键,"hi"是价值

这将使您的json值变为字符串内容.

  • 我认为这不是“最简单的方法” (2认同)

Cod*_*ord 5

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

使用这个方法:

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;
    }
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

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");
            }


   }
Run Code Online (Sandbox Code Playgroud)


swb*_*ann 5

Oracle 文档描述了如何

  1. 构建一个HttpRequest ,然后
  2. 由 HttpClient 发送到 URL

仅使用 Java 类库,只需几行代码。将此代码放入您的 main 方法中:

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("http://example.com/"))
      .build();
client.sendAsync(request, BodyHandlers.ofString())
      .thenApply(HttpResponse::body)
      .thenAccept(System.out::println)
      .join();
Run Code Online (Sandbox Code Playgroud)

响应由 JSON 对象 { ... } 组成,可以在您的应用程序中进一步处理。这里我将其打印到控制台,只是为了确认它是否有效:

System.out.println(request);
Run Code Online (Sandbox Code Playgroud)

这适用于 Java 版本 11+