我有这个解析类。这一行究竟是什么导致“无法解析”吐司出现和应用程序粉碎:JSONArray ja = new JSONArray(data);
因为数据字符串变量未初始化。我不知道如何正确地初始化它,因为我不太了解JSON概念。
全班代码:
public class Parser extends AsyncTask <Void, Void,Integer> {
Context ctx;
ListView listView;
String data;
ArrayList<String> titles = new ArrayList<>();
public Parser(Context ctx, String data, ListView listView) {
this.ctx = ctx;
this.data=data;
this.listView = listView;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Integer doInBackground(Void... params) {
return this.parse();
}
@Override
protected void onPostExecute(Integer integer) {
super.onPostExecute(integer);
if (integer == 1) {
ArrayAdapter adapter = new ArrayAdapter(ctx, android.R.layout.simple_list_item_1, titles);
listView.setAdapter(adapter);
} else {
Toast.makeText(ctx, "Unable to Parse", Toast.LENGTH_LONG).show();
}
}
private int parse() {
Log.d("Joudi",data);
try {
JSONArray ja = new JSONArray(data);
JSONObject jo = null;
titles.clear();
for (int i = 0; i < ja.length(); i++) {
jo = ja.getJSONObject(i);
String title = jo.getString("post_title");
titles.add(title);
}
return 1;
} catch (JSONException e) {
e.printStackTrace();
}
return 0;
}
}
我需要知道的是如何正确初始化“数据”,如果你建议任何优秀的特定来源(我知道有太多而且这就是问题)要学习JSON我会很感激。
从另一个类调用解析器的代码:
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
progressDialog.dismiss();
//Reset listView
listView.setAdapter(null);
if ( s!= null ){
if(! s.contains("null")) {
Parser parser = new Parser(ctx,s,listView);
parser.execute();
}else {
noNetwork.setVisibility(View.INVISIBLE);
noData.setVisibility(View.VISIBLE);
}
}else {
noNetwork.setVisibility(View.INVISIBLE);
noData.setVisibility(View.VISIBLE);
}
}
记录:
org.json.JSONException: Value already of type java.lang.String cannot be converted to JSONArray
at org.json.JSON.typeMismatch(JSON.java:111)
at org.json.JSONArray.<init>(JSONArray.java:96)
at org.json.JSONArray.<init>(JSONArray.java:108)
at com.example.joudialfattal.skillsexchange.Parser.parse(Parser.java:55)
at com.example.joudialfattal.skillsexchange.Parser.doInBackground(Parser.java:37)
at com.example.joudialfattal.skillsexchange.Parser.doInBackground(Parser.java:16)
at android.os.AsyncTask$2.call(AsyncTask.java:295)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
答案 0 :(得分:1)
以下是JSON的一个很好的介绍:https://www.w3schools.com/js/js_json_intro.asp
您的parse()代码假定一个JSON数组,其中包含名称为“post_title”和字符串值的对象。如果您将数据初始化为以下内容,则应该可以正常工作:
data = "[{\"post_title\":\"title1\"},{\"post_title\":\"title2\"}]";