使用杰克逊(fasterxml.jackson 2.1.1)时,是否有一种内置方法可以仅序列化孩子的 id?我们想Order
通过 REST 发送一个有Person
参考的。但是 person 对象非常复杂,我们可以在服务器端刷新它,所以我们只需要主键。
或者我需要一个自定义序列化器吗?还是我需要@JsonIgnore
所有其他属性?这会阻止在请求对象Person
时将数据发回吗?Order
我还不确定我是否需要它,但如果可能的话,我想控制它......
使用杰克逊(fasterxml.jackson 2.1.1)时,是否有一种内置方法可以仅序列化孩子的 id?我们想Order
通过 REST 发送一个有Person
参考的。但是 person 对象非常复杂,我们可以在服务器端刷新它,所以我们只需要主键。
或者我需要一个自定义序列化器吗?还是我需要@JsonIgnore
所有其他属性?这会阻止在请求对象Person
时将数据发回吗?Order
我还不确定我是否需要它,但如果可能的话,我想控制它......
有几种方法。第一个是用于@JsonIgnoreProperties
从子项中删除属性,如下所示:
public class Parent {
@JsonIgnoreProperties({"name", "description" }) // leave "id" and whatever child has
public Child child; // or use for getter or setter
}
另一种可能性,如果子对象总是序列化为 id:
public class Child {
// use value of this property _instead_ of object
@JsonValue
public int id;
}
还有一种方法是使用@JsonIdentityInfo
public class Parent {
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
@JsonIdentityReference(alwaysAsId=true) // otherwise first ref as POJO, others as id
public Child child; // or use for getter or setter
// if using 'PropertyGenerator', need to have id as property -- not the only choice
public int id;
}
这也适用于序列化,并忽略 id 以外的属性。然而,结果不会被包装为对象。
您可以像这样编写自定义序列化程序:
public class ChildAsIdOnlySerializer extends StdSerializer<Child> {
// must have empty constructor
public ChildAsIdOnlySerializer() {
this(null);
}
public ChildAsIdOnlySerializer(Class<Child> t) {
super(t);
}
@Override
public void serialize(Child value, JsonGenerator gen, SerializerProvider provider)
throws IOException {
gen.writeString(value.id);
}
然后通过注释字段来使用它@JsonSerialize
:
public class Parent {
@JsonSerialize(using = ChildAsIdOnlySerializer.class)
public Child child;
}
public class Child {
public int id;
}
例如,给定一个具有员工结构的简单公司,结合
@JsonIgnore
@ManyToOne(cascade = {CascadeType.REFRESH, CascadeType.DETACH})
@JoinColumn(name = "child_id")
我建议添加以下内容:
@JsonProperty("child_id")
如果没有它,将 child_id 作为属性发送,您将不会在客户端得到任何东西,
@JsonIgnoreProperties
并且-它将提供复制和粘贴从服务器接收到的 Json 并将其发回以进行更新的选项。没有它,您将在发回时收到异常,或者您必须从收到的 Json 中删除 child_id 属性。
public class Company {
@OneToMany(mappedBy = "company", cascade = CascadeType.ALL)
private List<Employee> employees;
}
@JsonIgnoreProperties(value = {"company_id"},allowGetters = true)
public class Employee{
@JsonIgnore
@ManyToOne(cascade = {CascadeType.REFRESH, CascadeType.DETACH})
@JoinColumn(name = "company_id")
public Company company
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class,
property="id")
@JsonIdentityReference(alwaysAsId=true)
@JsonProperty("company_id")
}
public Company getCompany() {
return company;
}
}