当 Python 调用 Java 接口失败,且 Java 日志打印出类似 **JSON parse error: xxxx 的警告时,通常是因为 Python 发送给 Java 的请求体(通常是 JSON 格式)存在格式问题**,导致 Java 端在解析 JSON 时抛出了异常(比如 com.fasterxml.jackson.core.JsonParseException 或类似的 JSON 解析错误)。
![图片[1]_Python调用Java接口失败(Java日志打印警告:JSON parse error:xxxx)的解决方案_知途无界](https://zhituwujie.com/wp-content/uploads/2025/11/d2b5ca33bd20251113093458.png)
一、问题本质分析
Java 接口一般会接收前端或客户端(如 Python)发送的 HTTP 请求,其中请求的 Body 往往是 JSON 格式的数据。如果 Python 发送的 JSON 数据:
- 不是合法的 JSON 格式(比如缺少引号、多了逗号、使用了单引号、混用了中文符号等);
- 字段名/类型不匹配(比如 Java 接口期望的是
"name"字段,你传了"Name",或者期望的是数字但你传了字符串); - 编码/传输问题(比如 Python 发送时未正确设置 Content-Type,或者编码不一致);
就会导致 Java 端在用 JSON 解析库(如 Jackson、Gson 等)解析请求体时失败,从而打印出类似如下的日志:
JSON parse error: Unexpected character (''' (code 39)): was expecting double-quote to start field name; nested exception is com.fasterxml.jackson.core.JsonParseException: Unexpected character ('''' (code 39)): was expecting double-quote to start field name...
或者:
JSON parse error: Unrecognized field "userName" (class com.example.RequestDTO), not marked as ignorable...
二、常见原因与解决方案
下面列出最常见的几种原因及其对应的排查和解决方式:
✅ 1. Python 发送的 JSON 格式不正确
问题描述:
Python 在构造请求体时,可能手动拼接了 JSON 字符串,或者使用了错误的格式(比如用了单引号 '、字段名未加双引号 "、结尾有多余逗号等),导致 Java 端解析失败。
错误示例(Python 拼接了非法 JSON):
# ❌ 错误!使用了单引号,字段未用双引号包裹,不是合法 JSON
data = "{'name': 'Alice', 'age': 25}" # 单引号非法!
response = requests.post(url, data=data)
正确做法:使用 json 参数或构造合法 dict 再转为 JSON
推荐使用 requests 库的 json 参数,它会自动将 Python dict 转为标准 JSON 并设置正确的 Content-Type。
✅ 推荐写法:
import requests
url = "http://your-java-api-endpoint"
data = {
"name": "Alice", # 注意:字段名和字符串值必须用双引号,但 Python dict 语法本身允许单/双引号,最终 requests 会转成标准 JSON
"age": 25
}
headers = {
"Content-Type": "application/json" # 必须声明,Java 服务端通常依赖此判断如何解析 body
}
response = requests.post(url, json=data, headers=headers) # ✅ 使用 json= 参数,自动序列化为合法 JSON
print(response.status_code)
print(response.text)
🔒 如果你非要自己构造 JSON 字符串(不推荐),必须保证是标准 JSON 格式:
import json
import requests
data_dict = {"name": "Alice", "age": 25}
data_json_str = json.dumps(data_dict) # 转为标准 JSON 字符串
headers = {"Content-Type": "application/json"}
response = requests.post(url, data=data_json_str, headers=headers) # 注意这里用 data= 而非 json=
⚠️ 注意:
- 不要使用
{'key': 'value'}这种 Python 字面量字符串 直接作为 JSON 发送,它不是合法的 JSON 格式! - 不要使用单引号
'包裹字段名或字符串值,JSON 标准要求必须用双引号"。 - 使用
requests.post(json=...)是最安全、最推荐的方式。
✅ 2. 字段名称/结构与 Java 接口不匹配
问题描述:
Java 接口通常会定义一个 DTO 类(如 UserRequest.java),并使用注解(如 @RequestBody)来接收 JSON,且字段名一般是确定的。如果 Python 发送的 JSON 中:
- 字段名拼写错误(如 Java 期望
"userName",你传了"username"或"UserName"); - 缺少必填字段;
- 多传了 Java 接口未定义的字段(且 Java 配置未忽略未知字段);
就会导致 Java JSON 解析器报错,例如:
JSON parse error: Unrecognized field "user_name" (class com.xxx.RequestDTO), not marked as ignorable
解决方案:
- 对照 Java 接口的 DTO 类定义,确保你发送的 JSON 字段名、类型完全匹配。
- 如果你不确定 Java 端接收的字段名,可以:
- 查看 Java 控制台日志,找到对应的 Controller 方法和 DTO 类;
- 或者让 Java 开发者提供接口文档(如 Swagger、OpenAPI 或接口说明);
- 或者让后端在解析异常时返回更详细的错误信息(比如打印收到的原始 JSON 和目标类)。
✅ 示例:确保字段名一致
假设 Java 端的 DTO 如下:
public class UserRequest {
private String name; // 注意是 name,不是 userName 或 Name
private int age;
// getters/setters
}
那么 Python 发送的 JSON 必须是:
data = {
"name": "Alice", # 必须是 name,不是 userName 或其他
"age": 25
}
✅ 3. 未正确设置请求头 Content-Type
问题描述:
即使你发送了合法的 JSON 字符串,如果 HTTP 请求头中 没有设置 Content-Type: application/json,Java 后端可能无法正确识别你发送的是 JSON,而是尝试按表单(form-data)、文本或其他格式解析,从而导致 JSON 解析失败。
解决方案:
使用 requests 时,务必加上请求头:
headers = {
"Content-Type": "application/json" # 告诉 Java 服务端,body 是 JSON
}
response = requests.post(url, json=data, headers=headers)
如果你使用的是 data= 手动传 JSON 字符串,也必须设置该 Header:
headers = {"Content-Type": "application/json"}
response = requests.post(url, data=json_str, headers=headers)
✅ 4. 编码问题(较少见)
问题描述:
如果你的 JSON 数据中包含非 ASCII 字符(如中文),而 Python 发送时未正确编码,或 Java 端未正确解码,也可能导致解析异常。但此类问题现在较少见,因为 UTF-8 是默认推荐编码。
解决方案:
- 确保你的 Python 文件保存为 UTF-8 编码;
- 使用
json.dumps()时无需特别处理,requests 会处理好编码; - 如果你手动构造 JSON 字符串,确保没有乱码或 BOM 头。
三、调试建议
✅ 1. 打印出你实际发送的 JSON 数据
在 Python 请求前,打印出你要发送的数据,确保它是你期望的格式:
print("即将发送的 JSON 数据:", data) # 查看 dict 是否正确
json_str = json.dumps(data, ensure_ascii=False, indent=2) # 格式化输出,方便检查
print("格式化后的 JSON 字符串:\n", json_str)
✅ 2. 捕获并打印 Java 返回的详细错误信息
有时 Java 端会返回更具体的错误信息(如收到的 JSON 和解析失败的详情),你可以打印 response.text 查看:
response = requests.post(url, json=data, headers=headers)
print("状态码:", response.status_code)
print("响应内容:", response.text) # 可能包含 Java 抛出的详细异常信息
✅ 3. 与 Java 开发者协作
如果仍然无法定位,建议将你发送的 完整 JSON 数据 和 Java 接口定义(如 Controller 和 DTO 类) 提供给 Java 开发者,让他们检查:
- 是否字段名匹配;
- 是否有必填校验;
- 是否开启了未知字段校验(如
@JsonIgnoreProperties(ignoreUnknown = false));
四、总结 checklist(快速排查)
| 问题点 | 是否检查 | 解决方案 |
|---|---|---|
| ✅ Python 是否发送了合法 JSON? | ☐ | 使用 requests.post(json=data),不要手动拼接 JSON 字符串 |
| ✅ JSON 字段名是否和 Java DTO 一致? | ☐ | 对照 Java 类,确保字段名完全匹配(如 name 不是 userName) |
✅ 是否设置了请求头 Content-Type: application/json? | ☐ | 必须设置,否则 Java 不知道你是 JSON |
| ✅ 是否打印了实际发送的数据和 Java 返回的错误详情? | ☐ | 用 print(data) 和 print(response.text) 调试 |
| ✅ 是否有特殊字符/编码问题? | ☐ | 一般无需特别处理,确保 JSON 是 UTF-8 |
五、附加:一个完整正确的 Python 调用示例
假设 Java 接口如下(伪代码):
@PostMapping("/user")
public ResponseEntity<String> createUser(@RequestBody UserRequest request) {
// UserRequest 有字段:String name; int age;
}
✅ Python 正确调用代码:
import requests
import json
url = "http://your-java-backend/api/user"
data = {
"name": "Alice",
"age": 25
}
headers = {
"Content-Type": "application/json"
}
response = requests.post(url, json=data, headers=headers)
print("状态码:", response.status_code)
print("响应内容:", response.text)
六、结语
当出现 **JSON parse error 时,绝大多数情况是 Python 端发送的 JSON 数据格式有问题**,而不是 Java 服务端的问题。重点检查:
- 你发送的 JSON 是否合法(推荐用
requests.json=自动处理); - 字段名是否和 Java DTO 完全一致;
- 是否设置了正确的
Content-Type: application/json请求头; - 是否打印并对比了实际发送的数据与 Java 端期望的数据。
按照上述步骤排查,99% 的类似问题都可以快速定位并解决! 🚀

























暂无评论内容