Jackson序列化Java对象时,如何去除JSON中的_class字段?
bw.write(mapper.writeValueAsString(objectB));
}
}
Class A的JSON输出示例: ```json { "_id": ObjectId("..."), "anotherVariableOfClassA": ..., "_class": "com.companyName.internalTool.ClassA" }
目前未发现其他序列化Class A的逻辑,现咨询如何去除JSON中的_class字段。
复现代码
Class A
public class A implements Serializable { private static final long serialVersionUID = 1L; @JsonIgnore private int id; private String tableName; private String sql; public A(int id, String tableName, String sql) { this.id = id; this.tableName = tableName; this.sql = sql; } }
Class B
public class B { private String name; private List<A> data; public B(String name, List<A> data) { this.name = name; this.data = data; } }
测试主类
public class Driver { public static void main(String[] args) { // 初始化A & B A a = new A(1, "tableName", "SQL"); ArrayList<A> list = Arrays.asList(a); B b = new B("name", list); ObjectMapper mapper = new ObjectMapper(); String jsonOutput = mapper.writeValueAsString(b); System.out.println(jsonOutput); } }
解决方案
1. 全局关闭Jackson类型信息序列化
_class字段是Jackson为支持多态序列化自动添加的类型标识,若无需多态处理,直接全局关闭该功能即可:
ObjectMapper mapper = new ObjectMapper(); // 禁用默认的类型信息写入 mapper.disableDefaultTyping();
2. 针对特定类禁用类型信息
如果全局关闭会影响其他业务逻辑,可给Class A添加注解,单独禁止写入类型信息:
@JsonTypeInfo(use = JsonTypeInfo.Id.NONE) public class A implements Serializable { // ... 类原有内容 }
3. 排查_id字段来源
_id字段大概率是MongoDB驱动自动生成的,建议先在序列化后直接打印JSON,确认该字段是Jackson生成还是MongoDB入库时添加的:
- 若为MongoDB驱动导致,可通过配置关闭自动生成
_id,或给实体类添加@Id注解映射到自定义字段,避免额外生成_id。
内容的提问来源于stack exchange,提问作者waffledood
相关产品推荐
相关产品推荐

