Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在AsyncTask[Android]中下载JSON_Java_Android_Json_Android Asynctask - Fatal编程技术网

Java 在AsyncTask[Android]中下载JSON

Java 在AsyncTask[Android]中下载JSON,java,android,json,android-asynctask,Java,Android,Json,Android Asynctask,我试图使用AsyncTask返回从web API读取JSON响应时生成的对象列表,但代码似乎运行不正常。我只是想知道是否有人能帮我一把,指出我做错了什么 我的AsyncTask类doInBackground()方法: @Override protected List<DublinBusObject> doInBackground(String... params) { String liveUpdateUrl = params[0]; List

我试图使用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;
    }
对不起,我忘了提到,这个代码:

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

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

您需要实际执行网络操作才能下载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;
}
/@覆盖
受保护列表doInBackground(字符串…参数){
字符串liveUpdateUrl=params[0];
List dublinBusObjects=new ArrayList();
试一试{
//使用JSONParser下载JSON
JSONParser JSONParser=新的JSONParser();
JSONObject JSONObject=jsonParser.makeHttpRequest(
liveUpdateUrl,“GET”,新的HashMap();
JSONArray JSONArray=jsonObject.getJSONArray(“停止”);
对于(int x=0;x
这将从以下位置使用此JSONParser类:

导入android.util.Log;
导入org.json.JSONException;
导入org.json.JSONObject;
导入java.io.BufferedInputStream;
导入java.io.BufferedReader;
导入java.io.DataOutputStream;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.InputStreamReader;
导入java.io.UnsupportedEncodingException;
导入java.net.HttpURLConnection;
导入java.net.URL;
导入java.net.urlcoder;
导入java.util.HashMap;
公共类JSONParser{
字符串charset=“UTF-8”;
httpurl连接连接;
数据输出流;
结果;
URL-urlObj;
JSONObject jObj=null;
字符串生成器sbParams;
字符串参数字符串;
公共JSONObject makeHttpRequest(字符串url、字符串方法、,
HashMap参数){
sbParams=新的StringBuilder();
int i=0;
for(字符串键:params.keySet()){
试一试{
如果(i!=0){
sbParams.append(“&”);
}
sbParams.append(键).append(“”)
.append(URLEncoder.encode(params.get(key),charset));
}捕获(不支持的编码异常e){
e、 printStackTrace();
}
i++;
}
if(方法等于(“POST”)){
//请求方法为POST
试一试{
urlObj=新URL(URL);
conn=(HttpURLConnection)urlObj.openConnection();
连接设置输出(真);
conn.setRequestMethod(“POST”);
conn.setRequestProperty(“接受字符集”,字符集);
连接设置读取超时(10000);
连接设置连接超时(15000);
连接();
paramsString=sbParams.toString();
wr=新的DataOutputStream(conn.getOutputStream());
writeBytes(paramsString);
wr.flush();
wr.close();
}捕获(IOE异常){
e、 printStackTrace();
}
}
else if(method.equals(“GET”)){
//请求方法是GET
如果(sbParams.length()!=0){
url+=“?”+sbParams.toString();
}
试一试{
urlObj=新URL(URL);
conn=(HttpURLConnection)urlObj.openConnection();
连接设置输出(假);
conn.setRequestMethod(“GET”);
conn.setRequestProperty(“接受字符集”,字符集);
连接设置连接超时(15000);
连接();
}捕获(IOE异常){
e、 printStackTrace();
}
}
试一试{
//从服务器接收响应
InputStream in=新的BufferedInputStream(conn.getInputStream());
BufferedReader reader=新的BufferedReader(新的InputStreamReader(in));
结果=新的StringBuilder();
弦线;
而((line=reader.readLine())!=null){
结果。追加(行);
}
Log.d(“JSON解析器”,“结果:+result.toString());
}捕获(IOE异常){
e、 printStackTrace();
}
连接断开();
//尝试将字符串解析为JSON对象
试一试{
jObj=新的JSONObject(result.toString());
}捕获(JSONException e){
Log.e(“JSON解析器”,“错误解析数据”+e.toString());
}
//返回JSON对象
返回jObj;
}
}

有什么问题吗?
liveUpdateUrl
的值是多少?这是我在帖子中看到的JSON url。如何使用调试器、设置断点并逐步检查?url还是实际的JSON字符串?
我不知道你必须事先下载它
-这有点让我失望:)
//@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;
}
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;
    }
}