68

使用杰克逊(fasterxml.jackson 2.1.1)时,是否有一种内置方法可以仅序列化孩子的 id?我们想Order通过 REST 发送一个有Person参考的。但是 person 对象非常复杂,我们可以在服务器端刷新它,所以我们只需要主键。

或者我需要一个自定义序列化器吗?还是我需要@JsonIgnore所有其他属性?这会阻止在请求对象Person时将数据发回吗?Order我还不确定我是否需要它,但如果可能的话,我想控制它......

4

3 回答 3

130

有几种方法。第一个是用于@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 以外的属性。然而,结果不会被包装为对象。

于 2013-07-11T00:29:33.237 回答
3

您可以像这样编写自定义序列化程序:

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;
}
于 2019-04-08T08:02:52.090 回答
1

例如,给定一个具有员工结构的简单公司,结合

@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;
    }
}
于 2019-12-26T06:19:39.013 回答