【问题标题】:Getting MalformedChunkCodingException while reading JSON data读取 JSON 数据时出现 MalformedChunkCodingException
【发布时间】:2025-11-30 14:40:01
【问题描述】:

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

org.apache.http.MalformedChunkCodingException:分块流意外结束

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

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

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();

【问题讨论】:

  • 将你的 resultString 转换为 JSONArray 并找出其中的 JSONObjects。 :)
  • @Droid 我在 reader.readline() 收到此异常
  • 所以我无法获得 resultString

标签: android json parsing streamreader


【解决方案1】:

我从这个方法中找到了解决方案

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();

    }

【讨论】:

    【解决方案2】:

    试试这个方法获取字符串响应体

    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());
    

    【讨论】:

    • 感谢您的快速响应,我尝试了您的解决方案,但在 reader.readline() 上得到了相同的异常
    • 我也收到此错误,并且无法找到解决方案。有已知的解决方法吗?
    【解决方案3】:
    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();
    

    试试这个

    【讨论】:

    • 你是在异步建立连接吗?