MongoDB文档_id字段无法映射到POJO对应属性问题求助
问题原因
你出现解析失败的核心原因是注解和JSON解析库不匹配:
你在POJO类上使用的@JsonProperty是Jackson JSON库专属的注解,而你实际执行JSON解析时用的是Gson库,Gson无法识别Jackson的注解,因此_id、$oid的字段映射规则完全不生效,导致_id字段解析失败。
解决方案
方案1:替换为Gson专属注解(改动最小)
把POJO类中的@JsonProperty全部替换为Gson的@SerializedName注解即可:
改后MetadataCollection类
import com.google.gson.annotations.SerializedName; public class MetadataCollection { @SerializedName("_id") private MetadataId id; private List<Metadata> metadata; public MetadataId getId() { return id; } public void setId(MetadataId id) { this.id = id; } public List<Metadata> getMetadata() { return metadata; } public void setMetadata(List<Metadata> metadata) { this.metadata = metadata; } }
改后MetadataId类
import com.google.gson.annotations.SerializedName; public class MetadataId { @SerializedName("$oid") private String id; public String getId() { return id; } public void setId(String id) { this.id = id; } }
改完后原有Gson解析逻辑不用动,就能正常解析_id字段。
方案2:换用Jackson作为解析库
如果你希望继续使用Jackson的@JsonProperty注解,就把解析逻辑换成Jackson的ObjectMapper实现:
// 建议全局初始化一次ObjectMapper,不要每次方法调用重复创建 ObjectMapper objectMapper = new ObjectMapper(); // 解析替换原有Gson解析逻辑 MetadataCollection metadata = objectMapper.readValue(jsonString, MetadataCollection.class);
方案3(推荐):直接使用MongoDB驱动的POJO映射
不需要中间转JSON再解析的冗余步骤,MongoDB Java驱动原生支持POJO直接映射,性能更高也不会出现注解不匹配的问题:
- 配置MongoClient时添加POJO编解码器
- 直接获取对应POJO类型的MongoCollection,调用find方法直接返回映射好的对象即可。
内容的提问来源于stack exchange,提问作者Karan
相关产品推荐
相关产品推荐

