2012-10-19 9 views
1

주석 필드의 타겟 유형에 따라 다르게 작동하는 Jackson 디시리얼라이저를 구성하려고합니다.타입 인식 Jackson 디시리얼라이저 만들기

public class Car { 
    @JsonSerialize(using=IdSerializer.class) 
    @JsonDeserialize(using=IdDeserializer.class) 
    String id 
} 

public class Bus { 
    @JsonSerialize(using=IdSerializer.class) 
    @JsonDeserialize(using=IdDeserializer.class) 
    Id id 
} 

잭슨 시리얼 라이저는 데이터를 변환되는 유형을 알고, 그래서 이것은 노력하고 있습니다 :

public class IdSerializer extends JsonSerializer<Object> { 
    @Override 
    public void serialize(Object value, JsonGenerator jsonGen, SerializerProvider provider) throws IOException { 

     // value is the annotated field class 
     if(value instanceof String) 
      jsonGen.writeObject(...); 
     else if (value instanceof Id) 
      jsonGen.writeObject(...); 
     else 
      throw new IllegalArgumentException(); 
    } 
} 

잭슨 디시리얼라이저는 데이터 변환합니다되는 대상 유형을 모르는 것 같다 :

public class IdDeserializer extends JsonDeserializer<Object> { 
    @Override 
    public Object deserialize(JsonParser jp, DeserializationContext context) throws IOException { 

     // what is the annotated field class? 
    } 
} 
+0

일부 형식 정보를 직렬화에 추가 할 수 있습니다. –

+0

@KyleRenfro 코드 샘플을 제공 할 수 있습니까? 감사. –

답변

1

직렬화 기에서 직렬화 해제 중에 도움이 될 유형에 대한 추가 정보를 추가 할 수 있습니다. 당신의 게시 IdSerializer에서

건물 ... 당신의 디시리얼라이저에서

public class IdSerializer extends JsonSerializer<Object> { 

    @Override 
    public void serialize(Object value, JsonGenerator jsonGen, SerializerProvider provider) throws IOException { 

     // value is the annotated field class 
     if(value instanceof String){ 
      jsonGen.writeStartObject(); 
      jsonGen.writeFieldName("id"); 
      jsonGen.writeObject(value); 
      jsonGen.writeFieldName("type"); 
      jsonGen.writeString("String"); 
      jsonGen.writeEndObject(); 
     } 
     else if (value instanceof Id){ 
      Id id = (Id) value; 
      jsonGen.writeStartObject(); 
      jsonGen.writeFieldName("id"); 
      jsonGen.writeString(id.getStuff()); 
      jsonGen.writeFieldName("type"); 
      jsonGen.writeString("Id"); 
      jsonGen.writeEndObject(); 
     } 
     else{ 
      throw new IllegalArgumentException(); 
     } 
    } 
} 

, 당신이 '유형'필드를 구문 분석하고 적절한 유형의 객체를 반환 할 수 있습니다.

+0

직렬화 된 개체가 데이터베이스에 유지됩니다. 그래서 jsonGen을 사용하는 것은 금지되어 있습니다 (DB에 쓸모없는 데이터가 남아있을 것입니다). –

+0

json을 데이터베이스에 저장하는 중입니다. 이 메서드는 더 많은 바이트를 필요로하지만 형식 정보는 쓸모없는 것처럼 보이지 않습니다. 역 직렬화 할 때 필요하기 때문입니다. –

+0

데이터베이스 문서는 영속 Java 객체와 동일합니다. 아이디어는 Id를 그대로 저장하고 다른 객체를 Id로 변환하는 것입니다. 모두에게 동일한 주석을 사용합니다. –