从HTTP响应获取JSON对象


80

我想JSON从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;
}

这是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();
}

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


1
您在结果字符串中得到什么?
R4chi7

为什么要使用两次response.getEntity()?
R4chi7

要返回一个JSON对象,请返回连接的Web服务器以发送UA JSON吗?这样做吗?
摇滚明星

@Zapnologica检查我的答案。另请参阅agen451答案
摇滚明星

Answers:


67

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

如果应该获取JSON对象,则可以输入:

JSONObject myObject = new JSONObject(result);

如果是HttpExchange ..,该怎么办?
赫玛'04

@Renan Bandeira我正在尝试将您的http响应转换为json对象的代码,但遇到此错误 Error:(47, 50) java: incompatible types: java.lang.StringBuffer cannot be converted to java.util.Map
Christos Karapapas

@Karapapas可以显示您的代码吗?我的回答是在2013年。我建议您使用Retrofit和Gson / Jackson之类的东西来处理请求和Json序列化。
雷南·班德拉

如何在C#中执行相同的任务?
Farrukh Sarmad '19年

9

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

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

8

如果不看一下确切的JSON输出,很难提供一些有效的代码。教程非常有用,但是您可以使用以下方法:

JSONObject jsonObj = new JSONObject("yourJsonString");

然后,您可以使用以下方法从此json对象检索:

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

1
非常好的教程。“通常,所有JSON节点都将以方括号或大括号开头。[和{的区别是,方括号([)表示JSONArray节点的开始,而大括号({)表示JSONObject。访问这些节点,我们需要调用适当的方法来访问数据。如果您的JSON节点以[开头,那么我们应该使用getJSONArray()方法。就像该节点以{开头一样,那么我们应该使用getJSONObject()方法。”
另一个

8

这样做以获得JSON

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

这里有更多详细信息:从HttpResponse获取json


32
那是一个字符串而不是一个JSON!
Francisco Corrales Morales 2014年

6
为什么会有这么多的投票?这只是一个toString()功能-基本上与OP所做的相同。
cst1992 '16

至少这消除了OP的许多底层开销代码。有关更完整的解决方案,请参见下面的@Catalin Pirvu帖子。
塞萨尔

3

您需要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;
}

希望这对您有帮助。


嗨,Apnologica ..如果有任何答案满足您的需要,请接受它,以使他人轻松达成正确答案。谢谢
Sushil

2

为了彻底解决此问题(是的,我知道这篇文章早就死了...):

如果你想JSONObject,那么首先得到了String来自result

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

然后,您可以获取JSONObject

JSONObject jsonObject = new JSONObject(jsonString);

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.