在读取JSON数据时获取MalformedChunkCodingException

时间:2013-10-21 05:11:36

标签: android json parsing streamreader

我在解析JSON数据时遇到了这个异常:

org.apache.http.MalformedChunkCodingException:Chunked stream意外终止

at org.apache.http.impl.io.ChunkedInputStream.getChunkSize

任何人都可以建议我做什么...我正在阅读流As:

HttpPost request = new HttpPost(url);
                StringBuilder sb=new StringBuilder();
                request.getParams().setParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, Boolean.FALSE);
                request.setHeader("Accept", "application/json");
                HttpResponse response =null;
                DefaultHttpClient httpClient = new DefaultHttpClient();
                //DefaultHttpClient httpClient = getNewHttpClient();
                HttpConnectionParams.setSoTimeout(httpClient.getParams(), timeOut); 
                HttpConnectionParams.setConnectionTimeout(httpClient.getParams(),timeOut); 
                response = httpClient.execute(request); 
                InputStream in = response.getEntity().getContent();
                BufferedReader reader = new BufferedReader(new InputStreamReader(in));
                String line = null;
                while((line = reader.readLine()) != null){
                    sb.append(line);
                }
                resultString = sb.toString();

3 个答案:

答案 0 :(得分:2)

我找到了解决方案来自这个方法

public static String getResponseStringFromURL(String url,int timeOut)
{ 
        StringBuilder  result = new StringBuilder();
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost request = new HttpPost(url);
        HttpResponse response =null;

        try {
            response = httpClient.execute(request);
        } catch (ClientProtocolException e) {   
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }


        HttpEntity entity = response.getEntity();
        InputStream input = null;
        try {
            input = new BufferedInputStream(response.getEntity().getContent());
        } catch (IllegalStateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        byte data[] = new byte[40000];

        long totalContactsCount = -1;
        int readContactsCount = 0;
        int currentByteReadCount = 0;

        /** read response from inpus stream */
        try {
            while ((currentByteReadCount = input.read(data)) != -1) {
                String readData = new String(data, 0, currentByteReadCount);
                result.append(readData);

                // then +1 progress on every ...},{... (JSON object separator)
                if (readData.indexOf("}~{") >= 0) {
                    readContactsCount++;
                }

               /* // publishing the progress....
                if (totalContactsCount > 0) {
                    publishProgress((int)(readContactsCount * 100 / totalContactsCount));
                }*/
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            input.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        /** transform response into JSONArray */
        return result.toString();

    }

答案 1 :(得分:0)

尝试使用此方法获取String响应正文

public String getResponseBody(final HttpEntity entity) throws IOException, ParseException {

    if (entity == null) {
        throw new IllegalArgumentException("HTTP entity may not be null");
    }

    InputStream instream = entity.getContent();

    if (instream == null) {
        return "";
    }

    if (entity.getContentLength() > Integer.MAX_VALUE) {
        throw new IllegalArgumentException(

        "HTTP entity too large to be buffered in memory");
    }

    StringBuilder buffer = new StringBuilder();

    BufferedReader reader = new BufferedReader(new InputStreamReader(instream, HTTP.UTF_8));

    String line = null;
    try {
        while ((line = reader.readLine()) != null) {
            buffer.append(line);
        }

    } finally {
        instream.close();
        reader.close();
    }
    return buffer.toString();

}

如何使用?

HttpResponse WSresponse = httpclient.execute(httppost);
String response = getResponseBody(WSresponse.getEntity());

答案 2 :(得分:0)

HttpResponse httpResponse = httpClient.execute(httpPost);
                InputStream  inputStream = httpResponse.getEntity().getContent();
                InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
                BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                StringBuilder stringBuilder = new StringBuilder();
                String  bufferedStrChunk = null;
                while((bufferedStrChunk = bufferedReader.readLine()) != null){
                    stringBuilder.append(bufferedStrChunk);
                }

                return stringBuilder.toString();

试试这个