programing

Jackson으로 자식 ID 만 직렬화하는 방법

copyandpastes 2021. 1. 19. 08:19
반응형

Jackson으로 자식 ID 만 직렬화하는 방법


Jackson (fasterxml.jackson 2.1.1)을 사용할 때 자식의 ID 만 직렬화하는 기본 제공 방법이 있습니까? 참조 Order가있는 REST를 통해 전송하려고합니다 Person. 그러나 person 객체는 매우 복잡하고 서버 측에서 새로 고칠 수 있으므로 기본 키만 있으면됩니다.

아니면이를 위해 사용자 지정 serializer가 필요합니까? 아니면 @JsonIgnore다른 모든 속성이 필요 합니까? 객체를 Person요청할 때 데이터가 다시 전송되는 것을 방지 할 Order있습니까? 아직 필요한지 확실하지 않지만 가능하면 제어하고 싶습니다 ...


몇 가지 방법이 있습니다. 첫 번째는 @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;
}

또 하나의 접근 방식은 @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 이외의 속성은 무시합니다. 그러나 결과는 Object로 래핑되지 않습니다.


다음과 같이 사용자 지정 serializer를 작성할 수 있습니다.

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

참조 URL : https://stackoverflow.com/questions/17542240/how-to-serialize-only-the-id-of-a-child-with-jackson

반응형