我几天前问了几个类似的问题,但现在我遇到了一个问题。在我的asynctask
下面,我正在解析Web服务数据。当我的Web服务将此数据返回到我的json
字符串
08-30 00:36:07.917: D/JSON String(1891): {
08-30 00:36:07.917: D/JSON String(1891): "all" : {
08-30 00:36:07.917: D/JSON String(1891): "count" : 25,
08-30 00:36:07.917: D/JSON String(1891): "questions" : [ {
08-30 00:36:07.917: D/JSON String(1891): "Id" : "20100728112033AAb4hTA",
08-30 00:36:07.917: D/JSON String(1891): "Subject" : "What is the oldest a bitch can more or less safely breed?",
08-30 00:36:07.917: D/JSON String(1891): "Content" : "Don't worry I'm not going to breed - both my bitches are getting neutered in the next year, as is my dog! Just that me and a friend were talking about it after talking to the man who gave me Misty (my border collie) who said she could still breed at 7 - I thought the oldest was 5?\n",
08-30 00:36:07.917: D/JSON String(1891): "Date" : "2010-07-28 18:20:33",
08-30 00:36:07.917: D/JSON String(1891): "Timestamp" : "1280341233",
08-30 00:36:07.917: D/JSON String(1891): "Link" : "http://answers.yahoo.com/question/?qid=20100728112033AAb4hTA",
08-30 00:36:07.917: D/JSON String(1891): "Type" : "Answered",
08-30 00:36:07.917: D/JSON String(1891): "CategoryId" : 396546021,
08-30 00:36:07.917: D/JSON String(1891): "CategoryName" : "Dogs",
08-30 00:36:07.917: D/JSON String(1891): "UserId" : "cP16Ctgxaa",
08-30 00:36:07.917: D/JSON String(1891): "UserNick" : "Kiko",
08-30 00:36:07.917: D/JSON String(1891): "UserPhotoURL" : "http://l.yimg.com/dg/users/1t1USxJpxAAEBQOGZjBMW0-5Wp_EG.medium.jpg",
08-30 00:36:07.917: D/JSON String(1891): "NumAnswers" : 8,
08-30 00:36:07.917: D/JSON String(1891): "NumComments" : 0,
08-30 00:36:07.917: D/JSON String(1891): "ChosenAnswer" : "You just \"imagined\" that ,dear...not \"thought\". & your imagination is WRONG.\r\n\r\n9 or even 10,for a healthy TOP-PRODUCING bitc-h.\r\n\r\n\r\n\r\n*&* bitches are SPAYED & dogs are CASTRATED......big scary correct ADULT words.",
08-30 00:36:07.917: D/JSON String(1891): "ChosenAnswererId" : "clN6YITvaa",
08-30 00:36:07.917: D/JSON String(1891): "ChosenAnswererNick" : "Debunker",
08-30 00:36:07.917: D/JSON String(1891): "ChosenAnswerTimestamp" : "1280317077",
08-30 00:36:07.917: D/JSON String(1891): "ChosenAnswerAwardTimestamp" : "1280835336"
08-30 00:36:07.917: D/JSON String(1891): }, {
我解析它并显示它,但是当它将它返回到我的json
字符串
09-02 00:25:55.466: D/JSON String(882): {
09-02 00:25:55.466: D/JSON String(882): "all" : {
09-02 00:25:55.466: D/JSON String(882): "count" : 0,
09-02 00:25:55.466: D/JSON String(882): "questions" : [ ]
09-02 00:25:55.466: D/JSON String(882): }
09-02 00:25:55.466: D/JSON String(882): }
我的代码假设显示错误消息,然后将用户返回到主活动。当它返回count 0
时,我的应用程序没有做任何事情,我的意思是当doInBackground
方法完成时它只显示一个空白屏幕,因为Web服务没有返回任何数据。它的行为就像我得到帮助的代码甚至不存在。所以我只是希望有人可以帮助我,你们可以帮助弄清楚发生了什么。
protected String doInBackground(String... args) {
try {
if (Integer.parseInt(json.getJSONObject("all").getString("count"))<=0){return "0";
}else{
JSONArray questions = json.getJSONObject("all").getJSONArray("questions");
for(int i = 0; i < questions.length(); i++) {
JSONObject question = questions.getJSONObject(i);
String Subject = question.getString(TAG_QUESTION_SUBJECT);
String ChosenAnswer = question.getString(TAG_QUESTION_CHOSENANSWER);
String Content = question.getString(TAG_QUESTION_CONTENT);
HashMap<String, String> map = new HashMap<String, String>();
map.put(TAG_QUESTION_SUBJECT, Subject);
map.put(TAG_QUESTION_CONTENT, Content);
map.put(TAG_QUESTION_CHOSENANSWER, ChosenAnswer);
questionList.add(map);
}
}} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return TAG_QUESTION ;
}
@Override
protected void onPostExecute(String file_URL) {
if(TAG_COUNT == null || TAG_COUNT.equals("0")){
Toast.makeText(ListView.this, "No data found", Toast.LENGTH_SHORT).show();
finish();
}else{
if (pDialog != null && pDialog.isShowing()) pDialog.dismiss();
ListAdapter adapter = new SimpleAdapter(getBaseContext(), questionList,
R.layout.listelements,
new String[] { TAG_QUESTION_SUBJECT }, new int[] {
R.id.Subject,});
setListAdapter(adapter);
}}}
答案 0 :(得分:1)
我建议您使用Gson自动解析文档。您可以为json对象创建相应的java类。整数,字符串值可以按原样映射。 Json可以这样解析:
Gson gson = new Gson();
Response r = gson.fromJson(jsonString, Response.class);
您有 link
中的完整示例答案 1 :(得分:0)
您永远不会在doInBackground
方法中使用onPostExecute()
的结果,这就是为什么没有发生。
在您的情况下,doInBackground
返回String
,onPostExecute()
接受String
作为参数(file_URL
)。
在doInBackground
中,当它没问题时,您返回TAG_QUESTION
,它必须是代码中其他地方声明的常量,当它失败时,您返回"0"
。
因此,在onPostExecute()
中,file_URL
将包含TAG_QUESTION
或"0"
的值。问题是你永远不会检查它的内容。此外,在doInBackground
中,您永远不会更改TAG_COUNT
的值。
因此,如果您想检查count
是否为空,则应替换
if(TAG_COUNT == null || TAG_COUNT.equals("0")){
通过
if(file_URL.equals("0")) {
应该这样做。
(理想情况下,如果您只想知道项目数量,最好在int
中返回String
而不是doInBackground