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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 23:05:02