Java 从 HTTP 响应中获取 JSON 对象

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/18073849/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-11 22:12:09  来源:igfitidea点击:

Get a JSON object from a HTTP response

javaandroidjson

提问by Zapnologica

I want to get a JSONobject from a Http get response:

我想JSON从 Http get 响应中获取一个对象:

Here is my current code for the Http get:

这是我当前的 Http get 代码:

protected String doInBackground(String... params) {

    HttpClient client = new DefaultHttpClient();
    HttpGet request = new HttpGet(params[0]);
    HttpResponse response;
    String result = null;
    try {
        response = client.execute(request);         
        HttpEntity entity = response.getEntity();

        if (entity != null) {

            // A Simple JSON Response Read
            InputStream instream = entity.getContent();
            result = convertStreamToString(instream);
            // now you have the string representation of the HTML request
            System.out.println("RESPONSE: " + result);
            instream.close();
            if (response.getStatusLine().getStatusCode() == 200) {
                netState.setLogginDone(true);
            }

        }
        // Headers
        org.apache.http.Header[] headers = response.getAllHeaders();
        for (int i = 0; i < headers.length; i++) {
            System.out.println(headers[i]);
        }
    } catch (ClientProtocolException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    return result;
}

Here is the convertSteamToString function:

这是 convertSteamToString 函数:

private static String convertStreamToString(InputStream is) {

    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    StringBuilder sb = new StringBuilder();

    String line = null;
    try {
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return sb.toString();
}

Right now I am just getting a string object. How can I get a JSON object back.

现在我只是得到一个字符串对象。如何取回 JSON 对象。

采纳答案by Renan Bandeira

The string that you get is just the JSON Object.toString(). It means that you get the JSON object, but in a String format.

您得到的字符串只是 JSON Object.toString()。这意味着您获得了 JSON 对象,但采用的是 String 格式。

If you are supposed to get a JSON Object you can just put:

如果你应该得到一个 JSON 对象,你可以输入:

JSONObject myObject = new JSONObject(result);

回答by Clyde

There is a JSONObject constructor to turn a String into a JSONObject:

有一个 JSONObject 构造函数可以将 String 转换为 JSONObject:

http://developer.android.com/reference/org/json/JSONObject.html#JSONObject(java.lang.String)

http://developer.android.com/reference/org/json/JSONObject.html#JSONObject(java.lang.String)

回答by Sushil

You need to use JSONObjectlike below:

你需要JSONObject像下面这样使用:

String mJsonString = downloadFileFromInternet(urls[0]);

JSONObject jObject = null;
try {
    jObject = new JSONObject(mJsonString);
} 
catch (JSONException e) {
    e.printStackTrace();
    return false;
}

...

...

private String downloadFileFromInternet(String url)
{
    if(url == null /*|| url.isEmpty() == true*/)
        new IllegalArgumentException("url is empty/null");
    StringBuilder sb = new StringBuilder();
    InputStream inStream = null;
    try
    {
        url = urlEncode(url);
        URL link = new URL(url);
        inStream = link.openStream();
        int i;
        int total = 0;
        byte[] buffer = new byte[8 * 1024];
        while((i=inStream.read(buffer)) != -1)
        {
            if(total >= (1024 * 1024))
            {
                return "";
            }
            total += i;
            sb.append(new String(buffer,0,i));
        }
    }
    catch(Exception e )
    {
        e.printStackTrace();
        return null;
    }catch(OutOfMemoryError e)
    {
        e.printStackTrace();
        return null;
    }
    return sb.toString();
}

private String urlEncode(String url)
{
    if(url == null /*|| url.isEmpty() == true*/)
        return null;
    url = url.replace("[","");
    url = url.replace("]","");
    url = url.replaceAll(" ","%20");
    return url;
}

Hope this helps you..

希望这对你有帮助..

回答by Joe Birch

Without a look at your exact JSON output, it's hard to give you some working code. Thistutorial is very useful, but you could use something along the lines of:

如果不查看确切的 JSON 输出,就很难为您提供一些工作代码。教程非常有用,但您可以使用以下内容:

JSONObject jsonObj = new JSONObject("yourJsonString");

Then you can retrieve from this json object using:

然后你可以使用以下方法从这个 json 对象中检索:

String value = jsonObj.getString("yourKey");

回答by Hybrid Developer

This is not the exact answer for your question, but this may help you

这不是您问题的确切答案,但这可能对您有所帮助

public class JsonParser {

    private static DefaultHttpClient httpClient = ConnectionManager.getClient();

    public static List<Club> getNearestClubs(double lat, double lon) {
        // YOUR URL GOES HERE
        String getUrl = Constants.BASE_URL + String.format("getClosestClubs?lat=%f&lon=%f", lat, lon);

        List<Club> ret = new ArrayList<Club>();

        HttpResponse response = null;
        HttpGet getMethod = new HttpGet(getUrl);
        try {
            response = httpClient.execute(getMethod);

            // CONVERT RESPONSE TO STRING
            String result = EntityUtils.toString(response.getEntity());

            // CONVERT RESPONSE STRING TO JSON ARRAY
            JSONArray ja = new JSONArray(result);

            // ITERATE THROUGH AND RETRIEVE CLUB FIELDS
            int n = ja.length();
            for (int i = 0; i < n; i++) {
                // GET INDIVIDUAL JSON OBJECT FROM JSON ARRAY
                JSONObject jo = ja.getJSONObject(i);

                // RETRIEVE EACH JSON OBJECT'S FIELDS
                long id = jo.getLong("id");
                String name = jo.getString("name");
                String address = jo.getString("address");
                String country = jo.getString("country");
                String zip = jo.getString("zip");
                double clat = jo.getDouble("lat");
                double clon = jo.getDouble("lon");
                String url = jo.getString("url");
                String number = jo.getString("number");

                // CONVERT DATA FIELDS TO CLUB OBJECT
                Club c = new Club(id, name, address, country, zip, clat, clon, url, number);
                ret.add(c);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        // RETURN LIST OF CLUBS
        return ret;
    }

}
Again, it's relatively straight forward, but the methods I'll make special note of are:

JSONArray ja = new JSONArray(result);
JSONObject jo = ja.getJSONObject(i);
long id = jo.getLong("id");
String name = jo.getString("name");
double clat = jo.getDouble("lat");

回答by rockstar

Do this to get the JSON

这样做以获取 JSON

String json = EntityUtils.toString(response.getEntity());

More details here : get json from HttpResponse

此处有更多详细信息:从 HttpResponse 获取 json

回答by Catalin Pirvu

For the sake of a complete solution to this problem (yes, I know that this post died long ago...) :

为了彻底解决这个问题(是的,我知道这篇文章很久以前就死了......):

If you want a JSONObject, then first get a Stringfrom the result:

如果您想要 a JSONObject,则首先String从以下获取 a result

String jsonString = EntityUtils.toString(response.getEntity());

Then you can get your JSONObject:

然后你可以得到你的JSONObject

JSONObject jsonObject = new JSONObject(jsonString);