1

次の Java の Android アプリケーション コードは、次のように出力します。

[{"handle":"DmitriyH","firstName":"Dmitriy","lastName":"Khodyrev","country":"Russia","city":"Moscow","organization":"KL","contribution":122,"rank":"master","rating":2040,"maxRank":"international master","maxRating":2072,"lastOnlineTimeSeconds":1432130513,"registrationTimeSeconds":1268570311}]}

codeforces api からデータを抽出する場合 - http://codeforces.com/api/user.info?handles=DmitriyH ;

しかし、ユーザーの「firstName」のみが必要です。誰でも私のコードの変更を推奨できますか??

public class Http extends Activity {
   TextView httpStuff;
   HttpClient client;
   JSONObject json;
   final static String URL = http://codeforces.com/api/user.info?handles=;


@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.httpex);

    httpStuff = (TextView)findViewById(R.id.tvHttp);
    client = new DefaultHttpClient();
    new Read().execute("result");
}

public JSONObject lastSub(String username) throws ClientProtocolException, IOException, JSONException {
    StringBuilder url = new StringBuilder(URL);
    url.append(username);
    HttpGet get = new HttpGet(url.toString());

    HttpResponse r = client.execute(get);
    //httpStuff.setText("xxx");
    int status = r.getStatusLine().getStatusCode();
    if(status == 200) {
        HttpEntity e = r.getEntity();
        String data = EntityUtils.toString(e);
        JSONObject last = new JSONObject(data);

        return last;
    }
    else {
        Toast.makeText(Http.this, "error", Toast.LENGTH_SHORT);
        return null;

    }
}

public class Read extends AsyncTask <String, Integer, String> {

    @Override
    protected String doInBackground(String... arg0) {
        // TODO Auto-generated method stub
        try {
            json = lastSub("avm12");
            return json.getString(arg0[0]);
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        // TODO Auto-generated method stub
        httpStuff.setText(result);
    }

}

}

4

4 に答える 4

1
public JSONObject lastSub(String username) throws ClientProtocolException, IOException, JSONException {
StringBuilder url = new StringBuilder(URL);
url.append(username);
HttpGet get = new HttpGet(url.toString());

HttpResponse r = client.execute(get);
//httpStuff.setText("xxx");
int status = r.getStatusLine().getStatusCode();
if(status == 200) {
    HttpEntity e = r.getEntity();
    String data = EntityUtils.toString(e);
    JSONObject last = new JSONObject(data).getJSONArray("result").getJSONObject(0);

    return last;
}
else {
    Toast.makeText(Http.this, "error", Toast.LENGTH_SHORT);
    return null;

}
}

編集

ここで、「codeforces.com/api/user.status?handle=avm12」という URL を使用しているとします。そして、最初の10個(またはn個)の「問題」タグを抽出したいと思います。じゃあどうすればいいの?

まず、ルートを取得しますJSONArray

JSONArray array= new JSONObject(data).getJSONArray("result");

次に、for ループで、必要なすべての JSONObjects を取得します

for(int k=0;k<n;k++){ // n must be less than array.length()
    JSONObject problemObject=array.getJSONObject(k).getJSONObject("problem");
   //do what you need to do with the problemObject E.G. Add them to an ArryList... 
}

&count=N出力を必要な N 個の結果に制限するために、URL に追加することを検討してください...

于 2015-05-21T08:42:32.303 に答える
0

最初のタグは であるため、 の代わりにJSONArrayreturn を使用してメソッドを作成する必要があります。あなたの要件として、あなたはそれを通り抜けることができますJSONArrayJSONObject

 jArray.getJSONObject(0).get("firstName");
于 2015-05-21T08:47:01.907 に答える
0

投稿したコードでは、正しい URL を使用していません。以下の作品:

final static String URL = http://codeforces.com/api/user.info?handles=;

...

protected String doInBackground(String... arg0) {
        // TODO Auto-generated method stub
        try {
            json = lastSub("DmitriyH");
            final JSONArray result = json.getJSONArray("result");
            final JSONObject jsonObject = result.getJSONObject(0);
            return jsonObject.getString("firstName");
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
....
于 2015-05-21T08:58:39.590 に答える
0

完全JSONObjectには tag の配列が含まれている"result"ため、次のように firstName を抽出する必要があります。

JSONArray result = json.getJSONArray("result");
JSONObject jo = result.getJSONObject(0);
String firstName = jo.getString("firstName");
于 2015-05-21T08:33:04.737 に答える