【问题标题】:get JSONObject from httpURLConnection and parsing into ArrayList从 httpURLConnection 获取 JSONObject 并解析成 ArrayList
【发布时间】:2017-01-02 17:46:03
【问题描述】:

我尝试从外部服务器上的 mysql 数据库获取单个数据行。到目前为止,它工作得很好。现在我尝试从服务器获取 JSONArray 以在 ListView 中显示它。我试图解释我遇到的问题。

备注:我删除了真实的 url,经过测试,url 和 php-script 都正常工作。如果我在浏览器中输入 url,脚本会以 JSON 格式提供请求的数据。

这里是我的代码部分:

    /**
 * Background Async Task to Load all product by making HTTP Request
 */
class LoadAllProducts extends AsyncTask<String, String, String> {

    ProgressDialog pdLoading = new ProgressDialog(AllProductsActivity.this);
    HttpURLConnection conn;
    URL url = null;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        //this method will be running on UI thread
        pdLoading.setMessage("\tLoading...");
        pdLoading.setCancelable(false);
        pdLoading.show();

    }

    @Override
    protected String doInBackground(String... params) {     //type must be a problem
        try {
            url = new URL("http://somewhere");

        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return "exception";
        }
        try {
            // Setup HttpURLConnection class to send and receive data from php and mysql
            conn = (HttpURLConnection) url.openConnection();
            conn.setReadTimeout(READ_TIMEOUT);
            conn.setConnectTimeout(CONNECTION_TIMEOUT);
            conn.setRequestMethod("POST");

            // setDoInput and setDoOutput method depict handling of both send and receive
            conn.setDoInput(true);
            conn.setDoOutput(true);

            // Post Parameter an URL anhängen
            Uri.Builder builder = new Uri.Builder()
                    .appendQueryParameter("loge", params[0]);
            String query = builder.build().getEncodedQuery();

            // Open connection for sending data
            OutputStream os = conn.getOutputStream();
            BufferedWriter writer = new BufferedWriter(
                    new OutputStreamWriter(os, "UTF-8"));
            writer.write(query);
            writer.flush();
            writer.close();
            os.close();
            conn.connect();

        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
            return "exception";
        }
        try {
            int response_code = conn.getResponseCode();
            // Check if successful connection made
            if (response_code == HttpURLConnection.HTTP_OK) {
                // Read data sent from server
                InputStream input = conn.getInputStream();
                try {
                    BufferedReader reader = new BufferedReader(new InputStreamReader(input));
                    StringBuilder result = new StringBuilder();
                    String line;
                    while ((line = reader.readLine()) != null) {
                        result.append(line);
                    }
                    JSONObject jsonObject = new JSONObject(result.toString());
                    // Pass data to onPostExecute method
                    return jsonObject.toString();       //this might be a problem
                   // return (result.toString());
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                //if something went wrong, return null
                return null;
            } else {

                return ("unsuccessful");
            }

        } catch (IOException e) {
            e.printStackTrace();
            return "exception";
        } finally {
            conn.disconnect();
        }
    }

    protected void onPostExecute(String result) {

        //no idea how to get ths JSONObject in the parameterlist and convert it to ArrayList
        ArrayList<String> listdata = new ArrayList<String>();
        String jArray = (String) result;
        if (jArray != null) {
            for (int i=0;i<jArray.length();i++){
                listdata.add(jArray(i));
            }
        }

第一个问题,doInBackground 函数选择哪种类型,而且我的返回应该不正确? 第二个,如何将jsonObject传递给我的函数onPostExecute?在这个位置应该使用哪种类型? 最后一个,如何将 jsonObject 变量的内容获取到我的 ArrayList 中?

另外:是的,我阅读了许多其他帖子和一些教程,但我无法将我得到的信息转移到我的示例中。

EDIT1:字符串的一部分,来自服务器:

[{"nr":"317","datum":"2016-02-09","zeit":"19:30:00","thema":"","kopfnr":"2 ","typ":"2"},{"nr":"318","datum":"2016-02-23","zeit":"20:00:00","thema":"Wandern ","kopfnr":"2","typ":"6"},{"nr":"319","datum":"2016-03-01","zeit":"18:45:00 ","thema":"Instruktion","kopfnr":"2","typ":"7"},{"nr":"320","datum":"2016-03-01","zeit ":"20:00:00","thema":"Eine Schwester stellt sich vor","kopfnr":"2","typ":"7"},{"nr":"321","datum ":"2016-03-08","zeit":"19:30:00","thema":"明镜周刊","kopfnr":"2","typ":"5"},{" nr":"322","datum":"2016-03-22","zeit":"20:00:00","thema":null,"kopfnr":"2","typ":" 6"}]

EDIT2:我按照解释错误消失了!我明白它是如何工作的。谢谢 我只剩下一个问题,如何从protected void onPostExecute( ArrayList&lt;String&gt; result) 获取数组列表 我以前对 asyncTask 函数的调用是:new LoadAllProducts().execute(loge); 但我可能无法 onPostExecute 更改具有返回值的函数,因为它是在 asyncTask 过程中自动调用的,对吧? 之后一切都完成了,我保证

【问题讨论】:

  • 显示从result中的服务器获取的字符串
  • JSON 字符串包含许多要添加到 ArrayList 中的项目?
  • 我强烈建议您改用 Retrofit 之类的东西。您可以使用转换器自动解析这样的响应。
  • @orbit 我不明白你的意思,你能举个例子吗
  • @ρяσѕρєя K 是的,最后我想展示所有的栏目,以便开始有一个更好的想法,一切是如何运作的,如果它显示 nr 我很高兴 :-)

标签: java android json arraylist


【解决方案1】:

第一个问题是 doInBackground 选择哪种类型 功能

帖子中的 JSON 字符串是 JSONArrayJSONObject's 而不是 JSONObject。在doInBackground 中从result 创建JSONArray

JSONArray jsonArray = new JSONArray(result.toString());

如何将 jsonObject 传递给我的 onPostExecute 函数?

而不是 JSONObject 返回 ArrayList 的项目。

如何将 jsonObject 变量的内容获取到我的 ArrayList?

解析 jsonArray 以从中获取所有 JSONObject,然后从每个 JSONObject 获取所需的值并将其添加到 listdata

ArrayList<String> listdata = new ArrayList<String>();
for(int n = 0; n < jsonArray.length(); n++)
{
    JSONObject object = jsonArray.getJSONObject(n);
    listdata.add(object.optString("nr")); 
}

return listdata;

【讨论】:

  • 我更改了 doInBackground 中的所有内容。通过这个返回 listdata.toString() 我在 onPostExecute 中得到一个字符串。嗯,那么如何将结果绑定到我的列表视图?它在同一个activity中,avtivity的名字是:public class AllProductsActivity extends ListActivity,listview是在我的xml文件all_products.xml
  • @pia-sophie: 不是listdata.toString() 只是返回listdata
  • @pia-sophie: 在 ListView 中显示数据,在 onPostExecute 方法中将 listdata 传递给您的适配器
  • 然后android studio显示错误:不兼容的类型,所以我应该将函数的返回类型..更改为什么类型? protected ArrayList doInBackground(ArrayList... params)?
  • @pia-sophie:老兄把AsyncTask&lt;String, String, String&gt; 改成AsyncTask&lt;String, String, ArrayList&lt;String&gt;&gt; onPostExecute( ArrayList&lt;String&gt; result)不用改doInBackground(String... params)
猜你喜欢
  • 2020-04-18
  • 1970-01-01
  • 1970-01-01
  • 2015-03-18
  • 2021-01-14
  • 1970-01-01
  • 2015-04-18
  • 1970-01-01
  • 2012-05-17
相关资源
最近更新 更多