Android的JSON响应正在被切断

时间:2014-08-04 14:16:23

标签: java android json

我已经看过很多关于这个话题的帖子,但似乎没有一个能解决我的问题。

问题是来自服务器的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());

    }
}

有人能看到问题吗?

4 个答案:

答案 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类对象你的属性)。

就我个人而言,我无法想象自己会手工做所有这些事情,只是没有好处就麻烦了=)