Nhận đối tượng JSON từ phản hồi HTTP


80

Tôi muốn nhận một JSONđối tượng từ một Http nhận phản hồi:

Đây là mã hiện tại của tôi cho 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;
}

Đây là hàm 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();
}

Ngay bây giờ tôi chỉ nhận được một đối tượng chuỗi. Làm cách nào để lấy lại một đối tượng JSON.


1
bạn nhận được gì trong chuỗi kết quả của mình?
R4chi7

và tại sao bạn lại sử dụng response.getEntity () hai lần?
R4chi7

Để lấy lại một đối tượng JSON, hãy tắt máy chủ web mà bạn kết nối để gửi lại JSON? Nó có làm được điều đó không?
rockstar

@Zapnologica kiểm tra câu trả lời của tôi. Cũng xem câu trả lời của agen451
rockstar

Câu trả lời:


67

Chuỗi mà bạn nhận được chỉ là JSON Object.toString (). Có nghĩa là bạn nhận được đối tượng JSON, nhưng ở định dạng Chuỗi.

Nếu bạn muốn lấy một Đối tượng JSON, bạn chỉ có thể đặt:

JSONObject myObject = new JSONObject(result);

Điều gì xảy ra nếu trong trường hợp HttpExchange ..?
Hema

@Renan Bandeira Tôi đang thử mã của bạn để chuyển đổi phản hồi http của tôi thành đối tượng json và tôi gặp lỗi này Error:(47, 50) java: incompatible types: java.lang.StringBuffer cannot be converted to java.util.Map
Christos Karapapas

@Karapapas bạn có thể hiển thị mã của bạn không? Câu trả lời của tôi là vào năm 2013. Tôi khuyên bạn nên sử dụng một cái gì đó là Retrofit và Gson / Jackson để giải quyết các yêu cầu và tuần tự hóa Json.
Renan Bandeira

làm thế nào tôi có thể thực hiện cùng một bài tập này trong c #?
Farrukh Sarmad

10

Làm điều này để nhận JSON

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

Thêm chi tiết tại đây: lấy json từ HttpResponse


32
đó là một chuỗi không phải là JSON!
Francisco Corrales Morales

6
Tại sao điều này có rất nhiều ủng hộ? Đây chỉ là một toString()chức năng - về cơ bản giống hệt như những gì OP đang làm.
cst1992

Ít nhất điều này sẽ loại bỏ rất nhiều mã chi phí cấp thấp của OP. Xem bài đăng của @Catalin Pirvu bên dưới để có giải pháp hoàn thiện hơn.
Cesar

9

Đây không phải là câu trả lời chính xác cho câu hỏi của bạn, nhưng điều này có thể giúp bạn

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

Nếu không xem đầu ra JSON chính xác của bạn, thật khó để cung cấp cho bạn một số mã hoạt động. Đây hướng dẫn là rất hữu ích, nhưng bạn có thể sử dụng một cái gì đó dọc theo dòng:

JSONObject jsonObj = new JSONObject("yourJsonString");

Sau đó, bạn có thể truy xuất từ ​​đối tượng json này bằng cách sử dụng:

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

1
Hướng dẫn rất hay. "Nói chung, tất cả các nút JSON sẽ bắt đầu bằng dấu ngoặc vuông hoặc bằng dấu ngoặc nhọn. Sự khác biệt giữa [và {là, dấu ngoặc vuông ([) biểu thị sự bắt đầu của một nút JSONArray trong khi dấu ngoặc nhọn ({) đại diện cho JSONObject. Vì vậy, trong khi khi truy cập các nút này, chúng ta cần gọi phương thức thích hợp để truy cập dữ liệu. Nếu nút JSON của bạn bắt đầu bằng [thì chúng ta nên sử dụng phương thức getJSONArray (). Tương tự như nếu nút bắt đầu bằng {, thì chúng ta nên sử dụng phương thức getJSONObject (). "
khác

3

Bạn cần sử dụng JSONObjectnhư bên dưới:

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

Hy vọng điều này sẽ giúp bạn ..


Xin chào Apnologica .. trong trường hợp bất kỳ câu trả lời nào phù hợp với nhu cầu của bạn, vui lòng chấp nhận nó để mang lại lợi ích cho những người khác trong việc tiếp cận câu trả lời chính xác một cách dễ dàng. cảm ơn
Sushil

2

Vì lợi ích của một giải pháp hoàn chỉnh cho vấn đề này (vâng, tôi biết rằng bài đăng này đã chết từ lâu ...):

Nếu bạn muốn a JSONObject, thì trước tiên hãy lấy a Stringtừ result:

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

Sau đó, bạn có thể nhận được JSONObject:

JSONObject jsonObject = new JSONObject(jsonString);

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.