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

JSON转Java反序列化:子文档ID未填充问题咨询

问题:JSON反序列化时子文档id字段未正确填充(顶层与子文档均含id)

在JSON到Java的反序列化操作中(字段名本应一一对应),遇到以下问题:JSON顶层和子文档都有id字段,但子文档的id字段没被正确填充。不过Principal类里的id字段能正常填充。

提供的JSON文档

{
  "_id": "a392ec9c-4f5c-411a-8599-928c5ce6b18d",
  "name": "polName",
  "rules": [
    {
      "t": "TestRule",
      "principals": [
        {
          "name": "Test Report",
          "id": "Test Report",
          "type": "PY"
        },
        {
          "name": "Test Report1",
          "id": "Test Report1",
          "type": "SY"
        }
      ]
    }
  ]
}

对应的Java DTO类

@JsonInclude(Include.NON_EMPTY)
@JsonIgnoreProperties(ignoreUnknown = true)
public class PolicyDto {

    
    @JsonProperty("docId")
    @JsonAlias({ "_id" })
    private String id;
    private String name;
    private List<Rule> rules;


    public String getId() {
        return id;
    }

    public void setId(final String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(final String name) {
        this.name = name;
    }

    public List<Rule> getRules() {
        return rules;
    }

    public void setRules(final List<Rule> rules) {
        this.rules = rules;
    }


    public static class Rule {
        private List<Principal> principals;

        public List<Principal> getPrincipals() {
            return principals;
        }

        public void setPrincipals(final List<Principal> principals) {
            this.principals = principals;
        }

    }


    public static class Principal {
        private String name;
        private String id;
        private String type;

        public String getName() {
            return name;
        }

        public void setName(final String name) {
            this.name = name;
        }

        public String getId() {
            return id;
        }

        public void setId(final String id) {
            this.id = id;
        }

        public String getType() {
            return type;
        }

        public void setType(final String type) {
            this.type = type;
        }

    }

}

问题分析与解决方案

首先明确:你提供的JSON中,除了Principal对象的id字段外,其他子文档(如Rule对应的对象)并没有id字段,且你说明Principal的id能正常填充。如果你的问题描述存在偏差(比如实际是顶层_id未映射到PolicyDto的id字段),可以参考以下排查方向:

  1. 检查Jackson版本
    @JsonAlias注解是Jackson 2.9及以上版本才支持的特性。如果项目使用的Jackson版本低于2.9,这个注解不会生效,导致JSON中的_id无法映射到PolicyDto的id字段,请升级Jackson到2.9+版本。

  2. 确认注解配置正确性
    确保@JsonProperty和@JsonAlias的位置一致(要么都放在字段上,要么都放在对应的getter/setter方法上),避免混合放置导致解析冲突。当前字段上的配置本身合理:@JsonAlias("_id")允许反序列化时接受_id字段,@JsonProperty("docId")指定序列化时输出为docId。

  3. 排查全局命名策略干扰
    如果项目中配置了全局属性命名策略(比如驼峰与下划线互转),可能和注解的局部配置冲突。可以尝试移除全局策略,或者显式在PolicyDto的id字段上添加@JsonProperty(value = "docId", access = JsonProperty.Access.READ_WRITE)来明确序列化/反序列化规则。

如果你的问题确实是某个子文档的id未填充,请检查:

  • JSON文档是否完整,是否遗漏了对应子文档的id字段
  • 对应的DTO子类是否添加了id字段及配套的getter/setter方法

另外补充:你的Rule类中没有对应JSON里的t字段,如果需要映射这个字段,需添加如下代码到Rule类中:

private String t;

public String getT() {
    return t;
}

public void setT(String t) {
    this.t = t;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 02:54:56