[英]HTTP GET Response parse error (empty String?) - but body is not empty
[英]Parse http GET response body
我正在连接一个网站及其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
}
]
}
/这是JSON,您可以使用Jackson r Gson之类的库对其进行反序列化。
http://jackson.codehaus.org/ http://code.google.com/p/google-gson/
您可以将Java对象映射到Json或将其反序列化为通用对象。
该数据格式为JSON(JavaScript对象表示法)。 因此,您只需要一个与Android兼容的JSON解析器(如GSON) ,就可以了。
Spring的RestTemplate
非常简单,它会自动将响应主体直接解组(即解析)为与响应的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对象获取。 它并没有变得简单得多。
在您的包中添加以下JSONParser.java类,并使用如下方式:
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;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.