gpt4 book ai didi

java - 通过JSON解析显示错误信息

转载 作者:行者123 更新时间:2023-11-29 05:38:37 26 4
gpt4 key购买 nike

当我的 WEBSERVICE 没有返回任何数据时,我想添加一条 toast 消息并使用户返回到主要 Activity ,并允许我进行更多解释。当用户搜索查询时,网络服务将数据返回到我的 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): }, {

这是我如何解析这些数据以获取我想要的特定数据的代码

protected String doInBackground(String... args) {

try {
Intent in = getIntent();
String searchTerm = in.getStringExtra("TAG_SEARCH");
String query = URLEncoder.encode(searchTerm, "utf-8");
String URL = "http://example.com";
JSONParsser jParser = new JSONParsser();
JSONObject json = jParser.readJSONFeed(URL);
try {

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);


}


} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return TAG_QUESTION ;

}

但是当用户搜索查询并且网络服务没有返回任何结果时,我的意思是网络服务数据有 "count": 0, 并且它在我的 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): }

当发生这种情况时,我希望弹出一条 toast 消息并将用户返回到主要 Activity ,但我只是不知道如何在返回计数 0 时解析该数据。我已经知道我需要添加一个 if 语句在此位置

        try {
// if statement here
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);

我需要知道如何解析 "count": 0, 以便我可以显示 toast 消息,然后将用户返回到主 Activity 。希望您能在这里看到我的想法,如果您在尝试理解我的意思时遇到任何问题,请告诉我。附言如果您想知道 JSONParsser 是什么,它就是我用来连接到网络服务的类,searchTerm 就是我传递 editText 并对其进行编码.

@Override
protected void onPostExecute(String file_URL) {

if(file_URL.equals("0")) {
pDialog.dismiss();
Toast.makeText(ListView.this, "No data found", Toast.LENGTH_SHORT).show();
finish();

}else{

if (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);
}

更新

        protected JSONObject doInBackground(String... args) {  

JSONObject json = new JSONObject();
try {
Intent in = getIntent();
String searchTerm = in.getStringExtra("TAG_SEARCH");
String query = URLEncoder.encode(searchTerm, "utf-8");
String URL = "http://example.com";
JSONParsser jParser = new JSONParsser();

json = jParser.readJSONFeed(URL);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return json;

}

@Override
protected void onPostExecute(JSONObject json) {

int count = 0;
try {
count = json.getJSONObject("all").getInt("count");
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(count>0) {
pDialog.dismiss();
Toast.makeText(ListView.this, "No data found", Toast.LENGTH_SHORT).show();
finish();

}else{

try {

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);

pDialog.dismiss();
ListAdapter adapter = new SimpleAdapter(getBaseContext(), questionList,
R.layout.listelements,
new String[] { TAG_QUESTION_SUBJECT }, new int[] {
R.id.Subject,});

setListAdapter(adapter);
}

} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}


}

}

最佳答案

要获取count值,只需执行

int count = json.getJSONObject("all").getInt("count");

(您应该将 "count" 替换为最终变量,就像您对代码中的其他 JSONObject 所做的那样)

然后在你做之前添加一个if

JSONArray questions = json.getJSONObject("all").getJSONArray("questions");

但是您将无法在 doInBackground 方法中显示您的 toast,您必须返回结果(一个字符串)并将其显示在 onPostExecute() 。到目前为止,您没有返回正确的值,您返回的是 TAG_QUESTION,它必须是最终字符串,这意味着您的处理结果永远不会在方法之外使用。

更新

我认为你应该这样做:

首先,您不应该在 doInBackground() 中完成所有处理。在这个方法中,你应该只检索你的 json,返回它并在 onPostExecute() 中处理它。为此,您需要更改 AsyncTask,使其看起来像这样(注意最后一个参数的变化,从 StringJSONObject) :

private class yourAsyncTask extends AsyncTask<String, Void, JSONObject> {

这将告诉您的程序doInBackground() 的返回值将是JSONObject 类型。所以你接下来要做的是改变你的 doInBackground() 让它看起来像那样(再次注意返回值的变化,从 StringJSONObject :

protected JSONObject doInBackground(String... args) {
JSONObject json = new JSONObject();
try {
Intent in = getIntent();
String searchTerm = in.getStringExtra("TAG_SEARCH");
String query = URLEncoder.encode(searchTerm, "utf-8");
String URL = "http://example.com";
JSONParsser jParser = new JSONParsser();

try {
json = jParser.readJSONFeed(URL);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return json;

}

然后将onPostExecute()中的参数类型改为JSONObject,检查count值后做你的处理:

@Override
protected void onPostExecute(JSONObject json) {

int count = json.getJSONObject("all").getInt("count");
if(count>0) { // There are some questions to retrieve

/* In this part I just copied what you put in your question,
I don't know what your goal is so I can't help much,
but you have the logic to do so */

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);

if (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);

} else {

Toast.makeText(ListView.this, "No data found", Toast.LENGTH_SHORT).show();
finish();

}

}

关于java - 通过JSON解析显示错误信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18564357/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com