从httpURLConnection获取JSONObject并解析为ArrayList

时间:2017-01-02 17:46:04

标签: java android json arraylist

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

备注:我删除了真正的网址,经过测试,网址和php脚本都正常工作。如果我在浏览器中键入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:字符串的一部分,来自服务器:

[{&#34; NR&#34;:&#34; 317&#34;&#34;基准&#34;:&#34; 2016年2月9日&#34;&#34;宰特& #34;:&#34; 19:30:00&#34;&#34; THEMA&#34;:&#34;&#34;&#34; kopfnr&#34;:&#34; 2&# 34;,&#34;典型值&#34;:&#34; 2&#34;},{&#34; NR&#34;:&#34; 318&#34;&#34;基准&#34 ;: &#34; 2016年2月23日&#34;&#34;宰特&#34;:&#34; 20:00:00&#34;&#34; THEMA&#34;:&#34; Wandern&# 34;,&#34; kopfnr&#34;:&#34; 2&#34;&#34;典型值&#34;:&#34; 6&#34;},{&#34; NR&#34 ;: #&34; 319&#34;&#34;基准&#34;:&#34; 2016年3月1日和#34;&#34;宰特&#34;:&#34; 18:45:00&# 34;,&#34; THEMA&#34;:&#34; Instruktion&#34;&#34; kopfnr&#34;:&#34; 2&#34;&#34;典型值&#34;:&# 34; 7&#34;},{&#34; NR&#34;:&#34; 320&#34;&#34;基准&#34;:&#34; 2016年3月1日和#34;,& #34; zeit&#34;:&#34; 20:00:00&#34;,&#34; thema&#34;:&#34; Eine Schwester stellt sich vor&#34;,&#34; kopfnr&#34 ;:&#34; 2&#34;&#34;典型值&#34;:&#34; 7&#34;},{&#34; NR&#34;:&#34; 321&#34;,& #34;基准&#34;:&#34; 2016年3月8日&#34;&#34;宰特&#34;:&#34; 19:30:00&#34;&#34; THEMA&#34 ;:&#34; Der Spiegel&#34;,&#34; kopfnr&#34;:&#34; 2&#34;,&#34; typ&#34;:&#34; 5&#34;},{ &#34; NR&#34;:&#34; 322&#34; &#34;基准&#34;:&#34; 2016年3月22日&#34;&#34;宰特&#34;:&#34; 20:00:00&#34;&#34; THEMA& #34;:空,&#34; kopfnr&#34;:&#34; 2&#34;&#34;典型值&#34;:&#34; 6&#34;}]

EDIT2:我按照解释错误消失了!我明白它是如何工作的。谢谢 我还剩下一个问题,如何从protected void onPostExecute( ArrayList<String> result)获取arraylist 我之前调用的asyncTask函数是:new LoadAllProducts().execute(loge);但是我可能会{= 1}}在函数中使用returnvalue进行更改,因为它在asyncTask进程中自动调用,对吧? 在那之后一切都结束了我保证

1 个答案:

答案 0 :(得分:1)

  

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

帖子中的JSON字符串是JSONArray的{​​{1}}而不是JSONObject's。从JSONObject中的JSONArray创建result

doInBackground
  

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

而不是JSONArray jsonArray = new JSONArray(result.toString()); 返回JSONObject项。

  

如何将jsonObject变量的内容提供给我的ArrayList?

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

listdata