@JsonIgnore与@Transient差异?

2022-09-01 22:52:49

哪一个用于跳过序列化和反序列化的字段。

@JsonIgnore如果@Transient也从序列化和反序列化过程中跳过字段,为什么我们应该使用它?


答案 1

两者之间的明显区别在于,它被用作 JPA 的一部分,以忽略标记为 的字段的持久性。@Transient@Transient

其中 as 仅用于忽略标记的字段,使其与 JSON 进行序列化、反序列化。@JsonIgnore

这意味着标记为的字段仍然可以保留在JPA持久性中,而标记为的字段既不会持久化,也不会被序列化,反序列化。@JsonIgnore@Transient


答案 2

我们应该区分javax.persistence.Transientjava.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


推荐