0

httpclient を使用して、django で記述された restapi を呼び出しました。json 出力が返されました。私の httpresponse 変数はそれを保存し、後で応答を文字列に変換してからjsonオブジェクトに変換します。私は Java に本当に慣れていないので、誰でもアドバイスできますか、以下のコードに代わる最良のロジックは何ですか

public void onClick(View v) {
    // TODO Auto-generated method stub

    HttpClient httpclient = new DefaultHttpClient();
    HttpGet httppost = new HttpGet("http://10.0.2.2:8000/api/ca/entry/?
            format=json&username=pragya");
    try {
        // Add your data
        //List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
        //nameValuePairs.add(new BasicNameValuePair("username", un.getText().toString()));
        //nameValuePairs.add(new BasicNameValuePair("username", pw.getText().toString()));
        //httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));


        HttpResponse response = httpclient.execute(httppost);
        HttpEntity entity = response.getEntity();
        InputStream is = entity.getContent();
        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();
            }
        }
        try {
            JSONObject jsonObject = new JSONObject(sb.toString());
            JSONObject meta = jsonObject.getJSONObject("meta");  
            String limit = meta.getString("limit");  
            Toast.makeText(HelloWorldActivity.this, limit, Toast.LENGTH_SHORT).show();
            JSONArray array = jsonObject.getJSONArray("objects");

            String key = array.getJSONObject(0).getString("api_key");
            String uname = array.getJSONObject(0).getString("username");
            Toast.makeText(HelloWorldActivity.this, uname + " " + key,
            Toast.LENGTH_SHORT).show();

        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }   
        //Toast.makeText(HelloWorldActivity.this, sb.toString(), Toast.LENGTH_SHORT).show();
    } catch (ClientProtocolException e) {
        Toast.makeText(HelloWorldActivity.this, e.toString(), Toast.LENGTH_SHORT).show();

        // TODO Auto-generated catch block
    } catch (IOException e) {
        // TODO Auto-generated catch block
        Toast.makeText(HelloWorldActivity.this, e.toString(), Toast.LENGTH_SHORT).show();
    }   
}
});

jsonは次のとおりです

{"meta": {"limit": 20, "next": null, "offset": 0, "previous": null, "total_count": 1}, "objects": [{"api_key": "c87391754b522d0c83b2c8b5e4c8cfd614559632deee70fdf1b48d470307e40e", "homeAddress": "kathmandu", "resource_uri": "/api/ca/entry/1/", "username": "sumit"}]}
4

2 に答える 2

5

Google のGsonライブラリを使用すると、この種のタスクに最適です。

必要なのは、json オブジェクト内のキーの名前を持つフィールドを含む新しいクラスを定義し、Gson を使用して Json 文字列を直接オブジェクトに解析するか、その逆を行うことだけです。

たとえば、次のようになります。

Json は次のようになります"limit": 20, "next": null, "offset": 0, "previous": null, "total_count": 1

Java クラスは次のようになります。

public class MyClass {
    private int limit;
    private int next;
    private int offset;
    private int previous;
    private int total_count;

public int getLimit() {
    return limit;
}
public void setLimit(int limit) {
    this.limit = limit;
}
public int getNext() {
    return next;
}
public void setNext(int next) {
    this.next = next;
}
public int getOffset() {
    return offset;
}
public void setOffset(int offset) {
    this.offset = offset;
}
public int getPrevious() {
    return previous;
}
public void setPrevious(int previous) {
    this.previous = previous;
}
public int getTotal_count() {
    return total_count;
}
public void setTotal_count(int total_count) {
    this.total_count = total_count;
}
}

そして、次のような Gson コードを使用します。

 Gson gson = new Gson(); // Or use new GsonBuilder().create();
 MyClass myClass = gson.fromJson(json, MyClass.class); // deserializes json into MyClass 

クラス フィールドの名前は、json 文字列内のキーの名前と正確に一致する必要があることに注意してください。

于 2012-06-18T12:38:43.243 に答える
1

常にを使用して、長い非UIタスクを実行しAsyncTaskます。説明したすべての操作、jsonのフェッチと解析は、で実行できますAsyncTaskonClickイベントで現在書いているコード全体を書いて、それdoInBackground()を書いてAsyncTaskください。

詳細については、以下を確認してください:http: //developer.android.com/reference/android/os/AsyncTask.html

于 2012-06-18T10:54:43.890 に答える