我已经看过很多关于这个话题的帖子,但似乎没有一个能解决我的问题。
问题是来自服务器的JSON响应正在被切断,因此我在尝试将响应转换为JSONArray时遇到了JSONException。
json = new JSONArray(EntityUtils.toString(response.getEntity()));
以下是整个代码:
private class AsyncFetchForms extends AsyncTask<String, Void, JSONArray> {
private HttpClient mClient = new DefaultHttpClient();
private AsyncTaskCompleteListener<JSONArray> listener;
private String serverUrl;
private String credentials;
private ProgressDialog progressDialog;
private HttpGet httpGet;
private String response;
private BasicResponseHandler responseHandler;
private boolean showDialog;
private JSONArray json;
public AsyncFetchForms(String url, String message, AsyncTaskCompleteListener<JSONArray> listener, boolean showDialog)
{
serverUrl = Utils.getServerUrl(context) + url;
credentials = Utils.getUserCredentials(context);
this.listener = listener;
this.showDialog = showDialog;
httpGet = new HttpGet(serverUrl);
httpGet.setHeader("Authorization", "Basic " + credentials);
httpGet.setHeader("Accept", "application/json");
httpGet.setHeader("Accept-Encoding", "gzip");
httpGet.setHeader("Connection", "keep-alive");
responseHandler = new BasicResponseHandler();
if(showDialog)
{
progressDialog = new ProgressDialog(context);
progressDialog.setMessage(message);
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressDialog.show();
}
}
@Override
protected JSONArray doInBackground(String... params) {
try {
HttpResponse response = mClient.execute(httpGet);
if (response.getStatusLine().getStatusCode() == 200) {
json = new JSONArray(EntityUtils.toString(response.getEntity()));
return json;
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(JSONArray result) {
System.out.println(result.toString());
}
}
有人能看到问题吗?
答案 0 :(得分:4)
Logcat只能显示大约4000个字符。因此,您必须实现递归函数才能查看整个日志。使用以下函数查看整个日志:
public static void longInfo(String str) {
if (str.length() > 4000) {
Log.d("", str.substring(0, 4000));
longInfo(str.substring(4000));
} else
Log.d("", str);
}
答案 1 :(得分:1)
如果您(或您的团队)自己实现服务器端,我首先要检查的是服务器是否返回正确的HTTP响应。特别是,如果您通过HTTP传输数据,则需要具有正确的Content-Length,否则您的数据将被截断。此外,Content-Length必须是在应用任何Transfer Encodings后的数据长度,换句话说,在gzip压缩后的数据长度之后。或者,使用分块转移。
其次,确保您的服务器生成有效的JSON。也许你错过了一个左右的括号。也许您需要解析JSON Object而不是JSON Array。
此外,如果您收到例外,请始终发布整个追溯。
答案 2 :(得分:0)
首先,尝试记录EntityUtils.toString(response.getEntity())
响应,并确保它以&#34; [
&#34;不是&#34; {
&#34;即。它是jsonArray
而不是jsonObject
。
然后尝试在浏览器中打开网址(如果可用),并确保没有编码问题。
最后,如果问题仍然存在,请将错误日志输出发送给我们。
答案 3 :(得分:0)
这个答案完全脱离了主题,但是:
你在这做什么?你知道有些图书馆正在为你做这些无聊的工作吗?
当我谈论无聊的工作时,我谈论的是管理所有后台运行的东西(如AsyncTask),JSON解码和HTTP响应。我知道它有时是a **的痛苦(我已经去过那里),但现在我已经选择不再担心并使用专用的库:http://square.github.io/retrofit/
这个小宝贝将联系您选择的Web服务,下载JSON并将其放入一个自定义的java类中,其中包含您要处理的所有属性。
如果使用ORMLite之类的东西插入它,它甚至可以将您的JSON响应对象保存到您可以以相同方式访问的SQLite DB中(它通过设置所有的#34;填充&#34; java类对象你的属性)。
就我个人而言,我无法想象自己会手工做所有这些事情,只是没有好处就麻烦了=)