如何将字符串变量定义为JSON有效 - Android

时间:2017-03-19 05:34:57

标签: android json

我有这个解析类。这一行究竟是什么导致“无法解析”吐司出现和应用程序粉碎: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)

1 个答案:

答案 0 :(得分:1)

以下是JSON的一个很好的介绍:https://www.w3schools.com/js/js_json_intro.asp

您的parse()代码假定一个JSON数组,其中包含名称为“post_title”和字符串值的对象。如果您将数据初始化为以下内容,则应该可以正常工作:

data = "[{\"post_title\":\"title1\"},{\"post_title\":\"title2\"}]";