【问题标题】:Android JSON receive issueAndroid JSON接收问题
【发布时间】:2013-03-15 14:21:36
【问题描述】:

我有一个字符串问题,我使用下面的代码从 URL 接收 JSON 数据,代码工作正常,但问题是我没有得到完整的数据,只有一半的 JSON 值来了,我想要要知道这是否有原因,如果有意味着如何解决这个问题。 JSON字符串很大

            DefaultHttpClient http_client = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(urls[0]);
            HttpResponse response = http_client.execute(httpGet);

            StatusLine statusLine = response.getStatusLine();
            int statusCode = statusLine.getStatusCode();
            HttpEntity entity = response.getEntity();

            InputStream in = entity.getContent();
            StringBuffer out = new StringBuffer();
            byte[] b = new byte[4096];
            int n =  in.read(b);
            while(n>0){
                out.append(new String(b, 0, n));
                n = in.read(b);
            }

            String resultdata = out.toString();
            Log.d("Out data",resultdata);

【问题讨论】:

  • 你怎么知道你只得到了一半的数据?
  • 当我将 URL 放在网络浏览器中时,它会给出完整的数据,当我将它与 Android 输出进行比较时,andorid 只给出一半的数据(不像浏览器中那样完整)
  • 你的 json 有多大...如果你的 json 太大,那么你可能会得到 OutOfMemoryError
  • 你如何比较?使用 Log.d("Out data", resultdata) 打印出来的内容?
  • 通常,logcat 的大小是最大条目是每行 4096 字节。所以如果你的resultdata大于4096,就会被截断。

标签: java android


【解决方案1】:

尝试使用 BufferedReader 获取这样的数据

    String line="";
   BufferedReader rd = new BufferedReader(new InputStreamReader(in));
                // Read response 
     while ((line = rd.readLine()) != null) { 
               total.append(line); 
            }
   String jsonString=total.toString();

【讨论】:

  • @Subramanian logcat 中是否有异常或任何错误?
  • @Subramanian Log cat 会跳过一些数据,如果它太大,您是否要记录您的 json?即使您使用调试器进行检查,它也不会显示完整的数据,如果您尝试这样做,则只需创建一个 json 对象,不要担心您的 json 搅拌,它已完成然后将创建 json 对象
  • @Subramanian 用响应字符串创建一个json对象,如果你的json不完整会抛出异常,检查一次
  • 当我增加字节数组时,它给出了完整的 JSON 字符串,感谢朋友帮助我。
【解决方案2】:
InputStream is = entity.getContent();
BufferedReader out = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = out.readLine()) != null) {sb.append(line + "\n");
            }
is.close();
String json = sb.toString();

试试这个

【讨论】:

    【解决方案3】:

    请试试这个,

     public static JSONObject getJson(String url){
    
        InputStream is = null;
        String result = "";
        JSONObject jsonObject = null;
    
        // HTTP
        try {           
            HttpClient httpclient = new DefaultHttpClient(); // for port 80 requests!
            HttpPost httppost = new HttpPost(url);
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();
            is = entity.getContent();
        } catch(Exception e) {
            return null;
        }
    
        // Read response to string
        try {           
            BufferedReader reader = new BufferedReader(new InputStreamReader(is,"utf-8"),8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            result = sb.toString();             
        } catch(Exception e) {
            return null;
        }
    
        // Convert string to object
        try {
            jsonObject = new JSONObject(result);            
        } catch(JSONException e) {
            return null;
        }
    
        return jsonObject;
    
    }}
    

    【讨论】:

      【解决方案4】:

      你必须删除这条线

      int n =  in.read(b);
      

      并添加

        int n=0;
      
          while ((n= in.read(b)) != null)
      

      【讨论】:

      • 不是缓冲区大小的问题 兄弟
      猜你喜欢
      • 2011-06-19
      • 2015-09-12
      • 1970-01-01
      • 1970-01-01
      • 2014-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多