JSON转Java反序列化:子文档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字段),可以参考以下排查方向:
检查Jackson版本
@JsonAlias注解是Jackson 2.9及以上版本才支持的特性。如果项目使用的Jackson版本低于2.9,这个注解不会生效,导致JSON中的_id无法映射到PolicyDto的id字段,请升级Jackson到2.9+版本。确认注解配置正确性
确保@JsonProperty和@JsonAlias的位置一致(要么都放在字段上,要么都放在对应的getter/setter方法上),避免混合放置导致解析冲突。当前字段上的配置本身合理:@JsonAlias("_id")允许反序列化时接受_id字段,@JsonProperty("docId")指定序列化时输出为docId。排查全局命名策略干扰
如果项目中配置了全局属性命名策略(比如驼峰与下划线互转),可能和注解的局部配置冲突。可以尝试移除全局策略,或者显式在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

