使用PUT方法通过WebService更新数据表时遇Volley解析错误求助
解决Volley PUT请求的ParseError与数据库空白字符问题
看起来你遇到了两个关联的问题:Volley解析响应时抛出的JSON输入错误,以及数据库中存入空白字符而非null。我来帮你拆解可能的原因和解决办法:
- 问题1:ParseError: End of input at character 0
这个错误的核心是Volley默认期望服务器返回有效的JSON,但你的PUT请求成功后,服务器可能返回了空响应或者非JSON格式的内容(比如纯文本、空字符串),导致Volley无法解析。
解决办法:重写JsonObjectRequest的parseNetworkResponse方法,处理空响应的情况:
@Override public void onClickUpdate(final int position, ...) { // 构建你的PUT请求 String url = "你的接口地址"; JSONObject jsonBody = new JSONObject(); // 填充请求体... JsonObjectRequest putRequest = new JsonObjectRequest(Request.Method.PUT, url, jsonBody, response -> { // 处理更新成功的逻辑 Toast.makeText(context, "更新成功", Toast.LENGTH_SHORT).show(); }, error -> { // 处理错误 Log.e("UpdateError", error.getMessage(), error); }) { @Override protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) { try { String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); // 当响应内容为空时,返回空的JSONObject避免解析错误 if (TextUtils.isEmpty(jsonString)) { return Response.success(new JSONObject(), HttpHeaderParser.parseCacheHeaders(response)); } // 正常情况调用父类解析 return super.parseNetworkResponse(response); } catch (UnsupportedEncodingException | JSONException e) { return Response.error(new ParseError(e)); } } }; // 将请求加入Volley队列 Volley.newRequestQueue(context).add(putRequest); }
- 问题2:数据库存入空白字符而非null
这说明你发送给服务器的是空字符串(""),而不是JSON的null值。如果期望数据库存储null,需要在构建请求体时区分空字符串和null:
// 构建请求体时的字段处理 String fieldValue = getFieldValue(position); // 你的字段值获取逻辑 try { if (TextUtils.isEmpty(fieldValue)) { // 发送JSON null而非空字符串 jsonBody.put("target_field", JSONObject.NULL); } else { jsonBody.put("target_field", fieldValue); } } catch (JSONException e) { e.printStackTrace(); }
另外,也要确认服务器端的接口逻辑:是否会将接收到的空字符串转换为null存入数据库。如果服务器没有做这个转换,即使客户端发了null,也可能被处理成空白字符,这时候需要和后端同学协作调整接口逻辑。
- 额外调试建议
用Android Studio的Network Inspector或者抓包工具查看PUT请求的实际内容和服务器响应:- 确认请求体中的字段是null还是空字符串
- 确认服务器返回的响应内容是否为空或非JSON格式
这能帮你快速定位问题出在客户端还是服务器端。
内容的提问来源于stack exchange,提问作者Enrique Espinosa
相关产品推荐
相关产品推荐

