如何将JSON根节点未被对象包裹的属性拆分到多个Java模型类并解决反序列化报错
问题原因
首先明确两个核心问题:
- JSON键与注解值大小写不匹配:你提交的JSON字段均为小驼峰格式(如
documentType、ply、numberOfCopies),但Java类中@JsonProperty配置的是大驼峰值,首先就会导致属性映射失败。 - 嵌套对象未配置解包规则:你将归属于
Ply类的ply、numberOfCopies字段放在了JSON根节点,但A类中的Ply类型字段没有配置解包注解,Jackson默认会尝试从根节点下找名为ply的嵌套JSON对象来反序列化,实际拿到的是字符串"0",找不到对应的转换逻辑就抛出了该异常。
解决方案
使用Jackson提供的@JsonUnwrapped注解即可实现散列在根节点的属性映射到嵌套Java类的需求,修改步骤如下:
- 修正所有
@JsonProperty的取值,和JSON中的键名完全匹配 - 在A类的嵌套业务对象字段上添加
@JsonUnwrapped注解,通知Jackson将该类的属性提到父级节点匹配 - 修正嵌套业务类内部的
@JsonProperty取值,和JSON根节点的对应字段匹配
修改后的代码示例
A类调整
public class A { // 修正JsonProperty值和JSON键名一致 @JsonProperty("documentType") private String documentType; @JsonProperty("documentGroup") private String documentGroup; // 加@JsonUnwrapped解包,Ply类的属性直接从根节点匹配 @JsonUnwrapped private Ply ply; @JsonProperty("tpDocNumbers") private List<String> tpDocNumbers; @JsonProperty("product") private Product product; // 其他属于根节点的散列属性对应的业务类,同样加@JsonUnwrapped @JsonUnwrapped private Cargo cargoInfo; @JsonUnwrapped private TaskCriteria taskCriteria; @JsonUnwrapped private Recipient recipientInfo; @JsonProperty("docBrokerDomain") private String docBrokerDomain; @JsonProperty("printerName") private String printerName; @JsonProperty("templateDomain") private String templateDomain; @JsonProperty("priority") private String priority; @JsonProperty("freeText") private String freeText; // 省略getter、setter }
Ply类调整
public class Ply { // 对应JSON根节点的ply字段 @JsonProperty("ply") private int plyNumber; // 对应JSON根节点的numberOfCopies字段 @JsonProperty("numberOfCopies") private int copies; @JsonProperty("freightSelection") private String freightSelection; // 省略getter、setter,记得补充无参构造方法 }
如果你的其他业务类(如TaskCriteria、Recipient)的属性也是散列在JSON根节点的,按照同样的规则调整即可。
内容的提问来源于stack exchange,提问作者Prakruti Pathik
相关产品推荐
相关产品推荐

