@JsonIgnore与@Transient差异?
哪一个用于跳过序列化和反序列化的字段。
@JsonIgnore如果@Transient也从序列化和反序列化过程中跳过字段,为什么我们应该使用它?
哪一个用于跳过序列化和反序列化的字段。
@JsonIgnore如果@Transient也从序列化和反序列化过程中跳过字段,为什么我们应该使用它?
两者之间的明显区别在于,它被用作 JPA 的一部分,以忽略标记为 的字段的持久性。@Transient
@Transient
其中 as 仅用于忽略标记的字段,使其与 JSON 进行序列化、反序列化。@JsonIgnore
这意味着标记为的字段仍然可以保留在JPA持久性中,而标记为的字段既不会持久化,也不会被序列化,反序列化。@JsonIgnore
@Transient
我们应该区分javax.persistence.Transient
和java.beans.Transient
。正如@shazin和@Abhishek Kumar所提到的,前者表示JPA忽略持久化的属性,并且不影响封送处理。Jackson 在编组过程中将后者与 JsonIgnore
视为一样,如 JacksonAnnotationIntrospector#_isIgnorable(Annotated)所示
:
protected boolean _isIgnorable(Annotated a)
{
JsonIgnore ann = _findAnnotation(a, JsonIgnore.class);
if (ann != null) {
return ann.value();
}
if (_java7Helper != null) {
Boolean b = _java7Helper.findTransient(a);
if (b != null) {
return b.booleanValue();
}
}
return false;
}
其中 Java7SupportImpl#findTransient(Annotated)
正在寻找 .java.beans.Transient