【问题标题】:Download JSON in an AsyncTask [Android] [closed]在 AsyncTask [Android] 中下载 JSON [关闭]
【发布时间】:2016-04-07 19:10:13
【问题描述】:

我正在尝试使用 AsyncTask 返回它通过从 Web API 读取 JSON 响应而生成的对象列表,但代码似乎无法正常运行。我只是想知道是否有人可以帮助我并指出我做错了什么。

我的 AsyncTask 类 doInBackground() 方法:

@Override
    protected List<DublinBusObject> doInBackground(String... params) {
        String liveUpdateUrl = params[0];
        List<DublinBusObject> dublinBusObjects = new ArrayList<>();
        try {

            JSONObject jsonObject = new JSONObject(liveUpdateUrl);
            for (int x = 0; x < jsonObject.getJSONArray("stops").length(); x++) {

                this.busRoute = jsonObject.getString("bus_num");
                this.busDescription = jsonObject.getString("description");
                this.bueTime = jsonObject.getString("exected_dep");
                this.busStopId = jsonObject.getString("stop_id");

                DublinBusObject dublinBusObject = new DublinBusObject(busRoute, busDescription, bueTime, busStopId);
                dublinBusObjects.add(dublinBusObject);
            }

            if (android.os.Debug.isDebuggerConnected()) android.os.Debug.waitForDebugger();
            Log.e("TAG", jsonObject.keys().next().toString());
            Log.e("TAG", jsonObject.toString());

        } catch (JSONException e) {
            e.printStackTrace();
        }
        return dublinBusObjects;
    }

它试图读取的 JSON 响应:

{  
   "stops":[  
      {  
         "aimed_dep":1437,
         "aimed_time":1437,
         "bus_num":"122",
         "congestion":"false",
         "description":"Ashington via City Centre",
         "direction":"Inbound",
         "exected_dep":1,
         "expected_time":1,
         "last_updated":1439,
         "stop_id":"00066",
         "timestamp":1439
      },
      {  
         "aimed_dep":27,
         "aimed_time":27,
         "bus_num":"122",
         "congestion":"false",
         "description":"Ashington via City Centre",
         "direction":"Inbound",
         "exected_dep":30,
         "expected_time":30,
         "last_updated":1439,
         "stop_id":"00066",
         "timestamp":1439
      },
      {  
         "aimed_dep":57,
         "aimed_time":57,
         "bus_num":"122",
         "congestion":"false",
         "description":"Ashington via City Centre",
         "direction":"Inbound",
         "exected_dep":57,
         "expected_time":57,
         "last_updated":1439,
         "stop_id":"00066",
         "timestamp":1439
      }
   ]
}

对不起,我忘了提,这段代码:

DublinBusObject dublinBusObject = new DublinBusObject(busRoute,
                            busDescription, bueTime, busStopId);
dublinBusObjects.add(dublinBusObject);

不运行并将新对象添加到 ArrayList。

【问题讨论】:

  • 有什么问题?
  • liveUpdateUrl的值是多少?
  • 这是我在帖子中的 JSON url。
  • 如何使用调试器,设置断点并逐步检查?
  • URL 还是实际的 JSON 字符串?

标签: java android json android-asynctask


【解决方案1】:

您需要实际执行网络操作才能下载 JSON 响应。然后,您需要正确解析它。

这里是下载 JSON 响应并解析它的代码,您需要遍历 JSONArray 中的每个 JSONObject:

//@Override
protected List<DublinBusObject> doInBackground(String... params) {
    String liveUpdateUrl = params[0];
    List<DublinBusObject> dublinBusObjects = new ArrayList<>();
    try {

        //Use JSONParser to download the JSON
        JSONParser jsonParser = new JSONParser();
        JSONObject jsonObject = jsonParser.makeHttpRequest(
                liveUpdateUrl, "GET", new HashMap<String, String>());

        JSONArray jsonArray= jsonObject.getJSONArray("stops");
        for (int x = 0; x < jsonArray.length(); x++) {

            JSONObject jsonItem = jsonArray.getJSONObject(x);

            this.busRoute = jsonItem.getString("bus_num");
            this.busDescription = jsonItem.getString("description");
            this.bueTime = jsonItem.getString("exected_dep");
            this.busStopId = jsonItem.getString("stop_id");

            DublinBusObject dublinBusObject = new DublinBusObject(busRoute, busDescription, bueTime, busStopId);
            dublinBusObjects.add(dublinBusObject);
        }

    } catch (JSONException e) {
        e.printStackTrace();
    }
    return dublinBusObjects;
}

这使用来自 another answer of mine 的 JSONParser 类:

import android.util.Log;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;

public class JSONParser {

    String charset = "UTF-8";
    HttpURLConnection conn;
    DataOutputStream wr;
    StringBuilder result;
    URL urlObj;
    JSONObject jObj = null;
    StringBuilder sbParams;
    String paramsString;

    public JSONObject makeHttpRequest(String url, String method,
                                      HashMap<String, String> params) {

        sbParams = new StringBuilder();
        int i = 0;
        for (String key : params.keySet()) {
            try {
                if (i != 0){
                    sbParams.append("&");
                }
                sbParams.append(key).append("=")
                        .append(URLEncoder.encode(params.get(key), charset));

            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            i++;
        }

        if (method.equals("POST")) {
            // request method is POST
            try {
                urlObj = new URL(url);

                conn = (HttpURLConnection) urlObj.openConnection();

                conn.setDoOutput(true);

                conn.setRequestMethod("POST");

                conn.setRequestProperty("Accept-Charset", charset);

                conn.setReadTimeout(10000);
                conn.setConnectTimeout(15000);

                conn.connect();

                paramsString = sbParams.toString();

                wr = new DataOutputStream(conn.getOutputStream());
                wr.writeBytes(paramsString);
                wr.flush();
                wr.close();

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        else if(method.equals("GET")){
            // request method is GET

            if (sbParams.length() != 0) {
                url += "?" + sbParams.toString();
            }

            try {
                urlObj = new URL(url);

                conn = (HttpURLConnection) urlObj.openConnection();

                conn.setDoOutput(false);

                conn.setRequestMethod("GET");

                conn.setRequestProperty("Accept-Charset", charset);

                conn.setConnectTimeout(15000);

                conn.connect();

            } catch (IOException e) {
                e.printStackTrace();
            }

        }

        try {
            //Receive the response from the server
            InputStream in = new BufferedInputStream(conn.getInputStream());
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            result = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                result.append(line);
            }

            Log.d("JSON Parser", "result: " + result.toString());

        } catch (IOException e) {
            e.printStackTrace();
        }

        conn.disconnect();

        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(result.toString());
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

        // return JSON Object
        return jObj;
    }
}

【讨论】:

  • I didn't realise you had to download it before hand - 这有点让我失望 :)
猜你喜欢
  • 1970-01-01
  • 2015-05-12
  • 2012-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-17
相关资源
最近更新 更多