Java 在AsyncTask[Android]中下载JSON
我试图使用AsyncTask返回从web API读取JSON响应时生成的对象列表,但代码似乎运行不正常。我只是想知道是否有人能帮我一把,指出我做错了什么 我的AsyncTask类doInBackground()方法: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
@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;
}
}