You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:18:50