2014-01-12 2 views
0

사용자 지정 jackson 일반 입력 된 빈 디시리얼라이저를 만들어야합니다. T는 IEntity를 구현하는 빈입니다. 클래스 이름을 기반으로 기업의잭슨 사용자 지정 일반 디시리얼라이저

public class RestLoaderRequestDeserializer extends JsonDeserializer<RestLoaderRequest<IEntity>> { 

    @Override 
    public RestLoaderRequest<IEntity> deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { 
     try { 
     ObjectCodec objectCodec = jp.getCodec(); 
     JsonNode node = objectCodec.readTree(jp); 
     String className = node.get("className").textValue(); 
     String fieldName = node.get("fieldName").textValue(); 

     Class<?> clazz = Class.forName(className); 

     JsonNode rawEntityNode = node.get("entity"); 
        // How to deserialize rawEntityNode to T based on className ? 

     RestLoaderRequest<IEntity> request = new RestLoaderRequest<IEntity>(); 
     request.setClassName(className); 
     request.setFieldName(fieldName); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 

    return null; 
    } 

} 

1) 어떻게 할 수있는 자동 직렬화 :

public interface IEntity { 
    public int getId(); 
} 

@JsonDeserialize(using = RestLoaderRequestDeserializer.class) 
@Produces(MediaType.APPLICATION_JSON) 
public class RestLoaderRequest<T extends IEntity> Serializable { 
    private T entity; // entity to load field to 
    private String className; // actual class of entity 
    private String fieldName; // fieldName to lazy REST load 

// constructors(non parameter & all parameter), getters, setters, hashCode, equals, toString 
} 

지금 내가 가지고있는 것은 이것이다?

+0

역 직렬화하려는 JSON을 제공 할 수 있습니까? – Eugen

+0

"엔터티"필드가 전혀 직렬화되지 않았기 때문에 좋은 질문이었습니다. 나는 내 자신의 커스텀 시리얼 라이저를 작성한 다음 그것을 어떻게 비 직렬화 하는지를 알았다. 나중에 정답을 올리겠습니다. 하지만 답장을 보내 주셔서 감사합니다. – termil0r

답변

0

유형 정보 처리 및 페이로드 데이터 처리는 별도입니다. 그래서 일반 JSON (de) serializer는 형식을 전혀 처리하지 않아야합니다. 대신 TypeSerializerTypeDeserializer이 분리되어 사용됩니다. 이것은 조합 수의 폭발을 방지하기 위해 수행됩니다. 몇 가지 TypeSerializer/-Deserializer 구현 (다른 포함 메커니즘)이 있지만 수백 개의 값 (de) 직렬자가 있습니다.

완전한 제어권을 가지고있을 때 맞춤식 (비) 직렬자는 분명히이 분리를 깨뜨릴 수 있습니다. 하지만 핵심 잭슨 (Jackson)은 이러한 구분을 가지고 있으며 표준 핸들러에서 예제를 볼 수 있습니다.

+0

나는 그 사실을 몰랐다. 정보 주셔서 감사합니다. 나는 그것을 곧 점검 할 것이다. – termil0r

관련 문제