1

データを取得するために Web サイトとその API に接続しています。以下の私のコードはそれを行い、応答本文を取得しますが、その応答本文を解析するにはどうすればよいですか? 必要な用語を検索し、各用語のサブコンテンツを取得する独自の関数を作成する必要がありますか? または、私のためにそれを行うことができる、使用できるライブラリが既にありますか?

private class GetResultTask extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... urls) {
      String response = "";

        DefaultHttpClient client = new DefaultHttpClient();
        HttpGet httpGet = new HttpGet("https://api.bob.com/2.0/shelves/45?client_id=no&whitespace=1");
        try {
          HttpResponse execute = client.execute(httpGet);
          InputStream content = execute.getEntity().getContent();

          BufferedReader buffer = new BufferedReader(new InputStreamReader(content));
          String s = "";
          while ((s = buffer.readLine()) != null) {
            response += s;
          }

        } catch (Exception e) {
          e.printStackTrace();
        }

      return response;
    }

    @Override
    protected void onPostExecute(String result) {
      apiStatus.setText(result); //setting the result in an EditText
    }
  }

レスポンスボディ

{
"id": 415,
"url": "http://bob.com/45/us-state-capitals-flash-cards/",
"title": "U.S. State Capitals",
"created_by": "bub12",
"term_count": 50,
"created_date": 1144296408,
"modified_date": 1363506943,
"has_images": false,
"subjects": [
    "unitedstates",
    "states",
    "geography",
    "capitals"
],
"visibility": "public",
"has_access": true,
"description": "List of the U.S. states and their capitals",
"has_discussion": true,
"lang_terms": "en",
"lang_definitions": "en",
"creator": {
    "username": "bub12",
    "account_type": "plus",
    "profile_image": "https://jdfkls.dfsldj.jpg"
},
"terms": [
    {
        "id": 15407,
        "term": "Montgomery",
        "definition": "Alabama",
        "image": null
    },
    {
        "id": 15455,
        "term": "Juneau",
        "definition": "Alaska",
        "image": null
    },

    {
        "id": 413281851,
        "term": "Tallahassee",
        "definition": "Florida",
        "image": null
    },
    {
        "id": 413281852,
        "term": "Atlanta",
        "definition": "Georgia",
        "image": null
    }
  ]
}
4

4 に答える 4

2

SpringRestTemplateは非常に単純であるため、応答本文を直接、応答の JSON 形式に一致する Java オブジェクトに自動的にアンマーシャリング (つまり解析) します。

最初に、必要に応じて JAXB アノテーションを使用して、データ形式に一致するように Java クラスを定義します。これは、応答本文に基づいたやや単純化されたモデルです。

@XmlRootElement
class MyResponseData {
    long id;
    String url;
    String title;
    String created_by;
    int term_count;
    int created_date;
    int modified_date;
    boolean has_images;
    List<String> subjects;
    Creator creator;
    List<Term> terms;
}

class Creator {
    String username;
    String account_type;
    String profile_image;
}

class Term {
    long id;
    String term;
    String definition;
    String image;
}

次に、Spring でリクエストを行うだけですRestTemplate

String url = "https://api.bob.com/2.0/shelves/45?client_id=no&whitespace=1";
RestTemplate template = new RestTemplate();
MyResponseData body = template.getForObject(url, MyResponseData.class);

3 行のコードでリクエストを作成し、レスポンスの本文を Java オブジェクトとして取得します。それはそれほど単純ではありません。

http://static.springsource.org/spring/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html

于 2013-05-25T02:21:46.213 に答える
0

Add following JSONParser.java class in your package and use like,

YourClass.java

JSONObject json = jParser.getJSONFromUrl(YOUR_URL_TO_JSON);

try {
        // Getting Array of terms
    JSONArray terms = json.getJSONArray("terms");

    // looping through All Contacts
    for(int i = 0; i < terms.length; i++){

         JSONObject termsJsonObject= terms.getJSONObject(i);

             String id = termsJsonObject.getJSONObject("id").toString();
             String term = termsJsonObject.getJSONObject("term").toString();
             String definition = termsJsonObject.getJSONObject("definition").toString();
             String image = termsJsonObject.getJSONObject("image").toString();

             // do  your operations using these values
         }
  }
  catch (JSONException e) {
        e.printStackTrace();
    return "";
  }

JSONParser.java

public class JSONParser {

    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";

    // constructor
    public JSONParser() {

    }

    public JSONObject getJSONFromUrl(String url) {

        // Making HTTP request
        try {
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);

            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();          

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }

        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

        // return JSON String
        return jObj;

    }
}
于 2013-05-25T02:00:10.900 に答える