HTTP応答からJSONオブジェクトを取得する


80

JSONHttp get応答からオブジェクトを取得したい:

Httpgetの現在のコードは次のとおりです。

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 2013

なぜresponse.getEntity()を2回使用しているのですか?
r4chi7 2013

JSONオブジェクトを取得するには、接続してua JSONを送信するWebサーバーを使用しますか?それはそれをしますか?
ロックスター2013

@Zapnologicaは私の答えを確認してください。agen451の回答も参照してください
ロックスター

回答:


67

取得する文字列は、JSON Object.toString()だけです。これは、JSONオブジェクトを取得することを意味しますが、文字列形式です。

JSONオブジェクトを取得することになっている場合は、次のように入力できます。

JSONObject myObject = new JSONObject(result);

HttpExchangeの場合はどうなりますか?
ヘマ2017

@Renan Bandeira http応答をjsonオブジェクトに変換するコードを試していますが、このエラーが発生します Error:(47, 50) java: incompatible types: java.lang.StringBuffer cannot be converted to java.util.Map
Christos Karapapas 2018年

@Karapapasコードを表示できますか?私の答えは2013年でした。リクエストとJsonのシリアル化を処理するには、RetrofitとGson / Jacksonとして何かを使用することをお勧めします。
ルナンBandeira

どうすればc#でこれと同じ割り当てを行うことができますか?
FarrukhSarmad19年

10

これを実行してJSONを取得します

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

詳細はこちら:HttpResponseからjsonを取得


33
それはJSONではなく文字列です!
フランシスココラレスモラレス

6
なぜこれほど多くの賛成票があるのですか?これは単なるtoString()機能です。基本的に、OPが実行しているのとまったく同じです。
cst1992 2016

少なくともこれは、OPの多くの低レベルのオーバーヘッドコードを取り除きます。より完全な解決策については、以下の@CatalinPirvuの投稿を参照してください。
セザール

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()メソッドを使用する必要があります。」
別の

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 ..回答のいずれかがあなたのニーズを満たした場合は、他の人が簡単に正解に到達できるように、それを受け入れてください。ありがとう
スシル2013

2

この問題の完全な解決のために(はい、私はこの投稿がずっと前に死んだことを知っています...):

が必要な場合はJSONObject、最初に:Stringからを取得しますresult

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

その後、あなたはあなたを得ることができますJSONObject

JSONObject jsonObject = new JSONObject(jsonString);

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.