在JPA / Jackson中{@ManyToOne对象与自定义子对象的序列化

时间:2019-01-23 09:28:01

标签: java json serialization jackson

我有两个具有双向@OneToMany / @ManyToOne关系的实体类。当我序列化Class A时,我不想在类A内拥有整个Class B,而只希望拥有id字段。但是,类B仍需要作为对象出现在类A中,而不仅仅是一个属性。我该如何实现?我正在使用JPA:2.2 / Jackson:2.9.0

@Entity
public class A {

    private long id;

    @ManyToOne
    private B b;

    // ...
}

@Entity
public class B {

    private long id;
    private String str;
    private boolean bool;

    @OneToMany
    Set<A> aList;
    // ...
}

A类的期望结果:

{
    "id" : 123;
    "b" : {
        "id" : 321;
    }
}

3 个答案:

答案 0 :(得分:0)

您可以使用@JsonIgnore批注忽略任何对象上的序列化 示例代码应为:

No provider for ngControl

答案 1 :(得分:0)

您可以尝试使用@JsonIgnoreProperties忽略某些字段

@Entity
public class A {

    private long id;

    @ManyToOne
    private B b;

    // ...
}

@Entity
public class B {

    private long id;
    private String str;
    private boolean bool;

    @OneToMany
    @JsonIgnoreProperties({"ignoreField1", "ignoreField2"})
    Set<A> aList;
    // ...
}

答案 2 :(得分:0)

有很多方法可以实现这一目标:

1)忽略属性:

@Entity
public class A {

    private long id;

    @JsonIgnoreProperties({"prop1", "prop2"})
    @ManyToOne
    private B b;
}

2)JsonIdentityInfoPropertyGenerator。需要id属性。

public class A {
   @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
   @JsonIdentityReference(alwaysAsId = true)
   public B b; 

   public long id;
}

3)JsonValue-指示应用于序列化整个实例的单个方法/字段。

public class B {

    @JsonValue
    public long id;
}

4)自定义序列化器:

@Entity
@JsonSerialize(using = ASerializer.class)
public class A {

    private long id;

    @ManyToOne
    private B b;

    // ...
}

在这种情况下,您需要实现ASerializer

这不是自定义序列化对象的最简单但灵活的细粒度方法。

请参见this示例。