Java中使用Jackson解析JSON获取X/Y值时遇序列化问题
问题分析与解决方案
你遇到的问题主要是反序列化目标类错误、属性名大小写不匹配、Java类方法/类型定义错误这几个原因导致的,咱们一步步来解决:
1. 核心错误:反序列化的目标类选错了
你的JSON顶层结构是包含StatusCode、Message、ExecutionTime、ResponseData数组的对象,而你直接用ResponseData.class去解析整个JSON,Jackson自然找不到StatusCode这个字段(因为ResponseData类里没有),所以抛出了UnrecognizedPropertyException。
正确的做法是先把整个JSON反序列化成你的PL类,再从PL对象里取出ResponseData列表。
2. 实体类的几个关键错误修正
(1)PL类的问题修正
ExecutionTime在JSON里是数字类型(值为0),但你的PL类里定义成了String,会导致类型转换错误,改成Long类型。ResponseData在JSON里是数组,你的PL类里定义成了单个ResponseData对象,应该改成List<ResponseData>或者ResponseData[]。- JSON里的字段是大驼峰(比如
StatusCode、ResponseData),Java类里是小驼峰,需要让Jackson识别这种映射,要么用@JsonProperty注解,要么配置ObjectMapper的命名策略。
修正后的PL类:
import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List; public class PL { @JsonProperty("StatusCode") private Long statusCode; @JsonProperty("ExecutionTime") private Long executionTime; @JsonProperty("Message") private String message; @JsonProperty("ResponseData") private List<ResponseData> responseData; public PL() {} // Getters and Setters public Long getStatusCode() { return statusCode; } public void setStatusCode(Long statusCode) { this.statusCode = statusCode; } public Long getExecutionTime() { return executionTime; } public void setExecutionTime(Long executionTime) { this.executionTime = executionTime; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public List<ResponseData> getResponseData() { return responseData; } public void setResponseData(List<ResponseData> responseData) { this.responseData = responseData; } }
(2)ResponseData类的问题修正
- 你写了个错误的方法:
public String setType(),这应该是getType()方法,否则Jackson无法正确读取Type字段的值。 - 同样用
@JsonProperty匹配JSON里的大驼峰字段。
修正后的ResponseData类:
import com.fasterxml.jackson.annotation.JsonProperty; public class ResponseData { @JsonProperty("Name") private String name; @JsonProperty("SiteId") private String siteId; @JsonProperty("Type") private String type; @JsonProperty("X") private String x; @JsonProperty("Y") private String y; public ResponseData() {} // Getters and Setters public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSiteId() { return siteId; } public void setSiteId(String siteId) { this.siteId = siteId; } public String getType() { // 这里修正了方法名 return type; } public void setType(String type) { this.type = type; } public String getX() { return x; } public void setX(String x) { this.x = x; } public String getY() { return y; } public void setY(String y) { this.y = y; } }
3. 正确的反序列化代码
现在你可以用PL类来解析整个JSON,然后遍历ResponseData列表获取X和Y值:
private final static ObjectMapper mapper = new ObjectMapper(); public void parseJson(String jsonStr) throws IOException { // 先解析整个JSON到PL对象 PL pl = mapper.readValue(jsonStr, PL.class); // 获取ResponseData列表 List<ResponseData> responseDataList = pl.getResponseData(); // 遍历获取每个对象的X和Y for (ResponseData data : responseDataList) { System.out.println("X: " + data.getX() + ", Y: " + data.getY()); } }
可选:不用@JsonProperty的替代方案
如果你不想每个字段都加@JsonProperty,可以配置ObjectMapper的命名策略,让它自动处理大驼峰到小驼峰的转换:
import com.fasterxml.jackson.databind.PropertyNamingStrategy; private final static ObjectMapper mapper = new ObjectMapper() .setPropertyNamingStrategy(PropertyNamingStrategy.UPPER_CAMEL_CASE);
这样JSON里的StatusCode会自动映射到Java类的statusCode属性,就不需要每个字段加注解了。
内容的提问来源于stack exchange,提问作者t3ng1l
相关产品推荐
相关产品推荐

