web-dev-qa-db-ja.com

ジャクソンと子供のIDのみをシリアル化する方法

ジャクソン(fasterxml.jackson 2.1.1)を使用するときに、子供のIDのみをシリアル化する組み込みの方法はありますか? OrderをRESTにPerson参照があります)経由で送信したいのですが、personオブジェクトは非常に複雑で、サーバー側で更新できます。必要なのは主キーだけです。

または、このためにカスタムシリアライザーが必要ですか?または、他のすべてのプロパティを@JsonIgnoreする必要がありますか? Personオブジェクトを要求するときに、Orderデータが返送されないようにしますか?それが必要かどうかはまだわかりませんが、可能であればそれを制御したいと思います...

53
Pete

いくつかの方法があります。まず、@JsonIgnorePropertiesを使用して、子からプロパティを削除します。

public class Parent {
   @JsonIgnoreProperties({"name", "description" }) // leave "id" and whatever child has
   public Child child; // or use for getter or setter
}

別の可能性、Childオブジェクトが常にidとしてシリアル化される場合:

public class Child {
    // use value of this property _instead_ of object
    @JsonValue
    public int id;
}

そしてもう1つのアプローチは@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以外のプロパティは無視されます。ただし、結果はオブジェクトとしてラップされません。

104
StaxMan

次のようなカスタムシリアライザーを作成できます。

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