Android通过HttpURLConnection接收WebService JSON数据全部变为0的问题排查
Android通过HttpURLConnection接收WebService JSON数据全部变为0的问题排查
看起来你遇到了一个挺让人头疼的问题——明明后端接口返回的JSON数值是正常的,但Android端用HttpURLConnection接收后,所有数值都变成了.00。我帮你梳理下可能的排查方向和解决思路:
一、先定位问题根源:确认Android端实际接收的原始数据
首先要搞清楚,是网络传输后的数据就已经是.00,还是后续JSON解析环节出了问题。你可以先把代码里注释掉的日志打开,或者在拼接完响应后打印完整的响应字符串:
while ((line=br.readLine())!=null){ Log.v("received line: ", line); // 打印每一行接收的内容 response.append(line); if(response.toString().contains("failed")){Log.e("Error de conexión:" ,response.toString());} } // 拼接完成后打印完整响应 Log.d("Full Response", response.toString());
如果打印出来的内容就是[{"Cant_38":".00","Cant_40":".00","Cant_42":".00}],那问题出在请求发送或后端返回逻辑;如果打印的内容和你测试Web端的[{"Cant_38":"2.00","Cant_40": "9.50","Cant_42":"2.00"}]一致,那问题就出在JSON解析环节。
二、针对HttpURLConnection的排查点
如果原始响应就是错误的.00,那可以从以下几个方向检查HttpURLConnection的配置:
- 请求头是否正确设置:确保后端能正确识别请求格式并返回正确的JSON,比如添加必要的请求头:
// 根据你的参数格式选择对应的Content-Type,如果是表单参数用下面这个 con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); // 如果是JSON格式的请求参数,用这个 // con.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); con.setRequestProperty("Accept", "application/json"); // 告诉后端我们要JSON格式的响应 con.setRequestProperty("Charset", "UTF-8"); - 请求参数是否正确发送:检查
this.params的内容是否和你测试Web端时的参数完全一致。比如是不是参数名拼写错误、参数值格式不对,导致后端返回了默认的0值?你可以把this.params的内容打日志确认:Log.d("Request Params", this.params); - 输入流读取的编码是否一致:你现在的
InputStreamReader没有指定编码,可能会因系统默认编码导致乱码或解析错误,建议明确指定UTF-8:BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8")); - 请求方法是否匹配:如果后端要求用POST请求,确保你设置了
con.setRequestMethod("POST");和con.setDoOutput(true);(你代码里已经获取了OutputStream,这一步应该已经做了,但最好再确认)。
三、如果是JSON解析环节的问题
如果原始响应字符串是正确的,但解析后数值变成0,那要检查你的JSON解析逻辑:
- 确认你获取数值的方法是否正确:比如后端返回的是字符串类型的数值(比如
"2.00"),如果你用getInt("Cant_38")可能会出问题,应该先用getString("Cant_38")获取字符串,再转成Double/Float,或者直接用getDouble("Cant_38")(注意JSONObject的getDouble方法可以处理字符串形式的数值)。 - 检查是否有其他逻辑修改了JSON数据:比如后续代码有没有对json对象做了额外的处理,导致数值被覆盖成0。
四、额外排查手段:抓包对比请求
用抓包工具(比如Charles、Fiddler)捕获Android端发送的HTTP请求,和你测试Web端的请求做对比,看看以下内容是否一致:
- 请求方法(POST/GET)
- 请求参数(包括参数名、参数值)
- 请求头(尤其是Content-Type、Accept等)
- 后端返回的响应内容
这样能快速定位到是Android端请求的问题,还是后端针对不同请求返回了不同结果。
备注:内容来源于stack exchange,提问作者ProgTerracom
相关产品推荐
相关产品推荐

