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

如何将JSON对象映射到子类实体?JSONB反序列化Dog时Eyes为空

问题排查与解决方案

针对你遇到的JSONB反序列化后Dog实例中eyes字段为null的问题,从以下几个方向排查:

1. 检查Animal类中Eyes字段的访问配置

JSONB默认依赖字段的getter/setter方法或者字段可见性完成反序列化:

  • 如果Animal中的eyes字段是private修饰,必须提供对应的public Eyes getEyes()和public void setEyes(Eyes eyes)方法;
  • 或者直接给eyes字段添加@JsonbProperty注解,强制JSONB识别该字段,示例:
    public abstract class Animal {
        @JsonbProperty
        private Eyes eyes;
        private String name;
    
        // 省略getter/setter或添加无参构造
    }
    

2. 确认JSONB对继承关系的处理

JSONB处理抽象类的子类时,需要明确类型识别规则:

  • 在抽象类Animal上添加@JsonbTypeInfo注解,指定类型标识字段;在Dog子类上添加@JsonbTypeName标注类型值:
    @JsonbTypeInfo(use = JsonbTypeInfo.Id.NAME, include = JsonbTypeInfo.As.PROPERTY, property = "animalType")
    public abstract class Animal {
        private Eyes eyes;
        private String name;
        // 省略构造、getter/setter
    }
    
    @JsonbTypeName("dog")
    public class Dog extends Animal {
        // 子类特有属性或空实现
    }
    
    此时请求JSON需要携带类型标识字段:
    {
      "animalType": "dog",
      "name": "旺财",
      "eyes": {
        "color": "black",
        "pupilSize": "normal"
      }
    }
    
  • 如果接口直接声明接收Dog类型(而非Animal),确保接口参数注解正确(比如JAX-RS中使用@Consumes(MediaType.APPLICATION_JSON),Spring中用@RequestBody),避免框架将参数按抽象类Animal处理。

3. 检查Eyes类的反序列化基础条件

JSONB反序列化对象必须满足:

  • Eyes类存在无参构造函数(默认隐式存在,若手动添加了带参构造,需显式声明无参构造);
  • Eyes类的字段同样要有正确的getter/setter或@JsonbProperty注解,确保内部字段能被正常解析。

4. 验证JSON请求体格式

确保请求体中eyes是嵌套对象结构,字段名与实体类完全一致(JSONB默认大小写敏感):

错误示例(eyes为字符串):

{ "name": "旺财", "eyes": "brown" }

正确示例:

{
  "name": "旺财",
  "eyes": {
    "color": "brown",
    "isDoubleEyelid": true
  }
}

内容的提问来源于stack exchange,提问作者Displayname

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 22:30:52