如何仅序列化杰克逊孩子的 ID

2022-08-31 14:09:29

有没有一种内置的方法可以在使用Jackson时只序列化孩子的id(fasterxml.jackson 2.1.1)?我们想通过 REST 发送一个有引用的。然而,person对象非常复杂,我们可以在服务器端刷新它,所以我们所需要的只是主键。OrderPerson

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


答案 1

有几种方法。第一个是 用于从子项中删除属性,如下所示:@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 以外的属性。但是,结果不会包装为对象。


答案 2

您可以编写自定义序列化程序,如下所示:

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;
}