当前位置: 首页 > 知识库问答 >
问题:

如何使用jackson创建一个自定义反序列化器来将数字(即部门ID)转换为部门对象?

司寇瑾瑜
2023-03-14

我有一个名为User和Department的类,它们指向mysql数据库中各自的表(多对多关系)。我想为User类中的列表部门创建一个自定义反序列化器。

{“用户ID”:1456,“第一名”:“大卫”,“中间名”:“”,“最后名”:“贝克汉姆”,“性别”:“M”,“rollno”:“”,“学期”:0,“区段”:“”,“电子邮件”:“david8@gmail.com”,“密码”:“d123avid”,“电话”:“9844547852”,“状态”:0,“用户类型”:1,“用户生物”:“我教统计学”,“profilepicture”:null,“dob”:“1999-03-21”,“facultytype”:1,“部门”:[109]}

我的用户类定义如下:

@Entity
@Table(name="user")
public class User {

@Id
@Column(name="user_id")
@JsonFormat(shape = JsonFormat.Shape.NUMBER)
private long userId; 

@Column(name="first_name")
private String firstName;

@Column(name="middle_name")
private String middleName;

@Column(name="last_name")
private String lastName;

@Column(name="gender")
private char gender;

@Column(name="roll")
private String rollNo;

@Column(name="semester")
private byte semester;

@Column(name="section")
private char section;

@Column(name="email")
private String email;

@Column(name="password")
private String password;

@Column(name="phone")
private String phone;

@Column(name="status")
private byte status;

@Column(name="user_type")
private byte userType;

@Column(name="user_bio")
private String userBio;

@Column(name="profile_picture")
private String profilePicture;

@Column(name="dob")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
private LocalDate dob;

@Column(name="faculty_type")// 0 is for student, 1 for permanent and 2 for visiting
private byte facultyType;

//for join table
@ManyToMany(fetch=FetchType.EAGER,
        cascade= {CascadeType.PERSIST, CascadeType.MERGE,CascadeType.DETACH, CascadeType.REFRESH})
@JoinTable(
    name="user_department",
    joinColumns=@JoinColumn(name="user_id"),
    inverseJoinColumns=@JoinColumn(name="dept_id")
    )
private List<Department> departments;

目前我得到一个错误

JSON解析错误:无法构造com.maverick.project.entity.department的实例:没有int/int-argument构造函数/Factory方法可以从数字值(109)反序列化;嵌套异常是com.fasterxml.jackson.databind.jsonMappingException:无法构造com.maverick.project.entity.department的实例:没有int/int-参数构造函数/工厂方法可以从数字值反序列化(109)

我的部门类定义如下:

@Entity
@Table(name="department")
public class Department {

@Id
@Column(name="dept_id")
@JsonFormat(shape = JsonFormat.Shape.NUMBER)
private int deptId;

@Column(name="dept_name")
private String deptName;


@ManyToMany(fetch=FetchType.EAGER,
        cascade= {CascadeType.PERSIST, CascadeType.MERGE,CascadeType.DETACH, CascadeType.REFRESH})
@JoinTable(
    name="user_department",
    joinColumns=@JoinColumn(name="dept_id"),
    inverseJoinColumns=@JoinColumn(name="user_id")
    )
@JsonIgnore
private List<User> users;

共有1个答案

微生烨然
2023-03-14

您不需要自定义反序列化程序。您可以添加一个参数构造函数,它接受int:

public Department() {
}

public Department(int deptId) {
    this.deptId = deptId;
}

并且它将自动反序列化到department。在反序列化之后,如果需要的话,您需要进行额外的配置。

 类似资料:
  • 我希望在Jackson中为Enum类的集合创建一个自定义反序列化器。因为自定义反序列化器的行为对于所有枚举都是相同的。我想为我的所有枚举类创建公共反序列化程序。 我尝试使一般自定义反序列化如下: 问题是我想在反序列化器中调用枚举静态方法,但无法这样做,因为我没有任何可用的类/枚举上下文信息。 你能帮我知道如何实现它吗?

  • 我已经编写了一个自定义反序列化器,它将接受字符串并对其进行反序列化公共静态类MyDeserializer extends JsonDeserializer{

  • JSON文档有一个属性,其中包含一组对象(也可以是使用属性名称作为键的映射)。这是唯一一个在JSON中完全序列化columns对象的地方。在其他任何地方,列都使用唯一的属性进行引用 引用可用于映射键和值 我想将此文档反序列化并: 解析属性中对应对象的引用 使用相同的java对象实例(列类是不可变的),而不是每次都创建一个新的。(我想减少对象的数量) JsonIdtyInfoesnt不适用于地图键。

  • 我有一个Websocketendpoint,我想作为头值接收它,不是字符串,而是对象。 你知道怎么做吗?

  • 想象一下以下场景: 我想为Foo编写一个自定义的Jackson反序列化程序。为了做到这一点(例如,为了反序列化具有Foo的类 如何编写这样的反序列化程序?这应该是可能的,因为Jackson是通过键入集合和地图来实现的。 澄清: 似乎有两个部分可以解决这个问题: 1)获取内声明的属性类型并使用它来反序列化

  • 问题内容: 在杰克逊的数据绑定的文档表明,杰克逊支持deserialising“所有支持类型的数组”,但我不能找出确切的语法这一点。 对于单个对象,我可以这样做: 现在,对于数组,我想这样做: 有人知道是否有不可思议的命令吗?如果没有,那么解决方案是什么? 问题答案: 首先创建一个映射器: 作为数组: 作为列表: 指定列表类型的另一种方法: