2014-01-12 47 views
0

我需要创建自定义jackson通用类型bean解串器。 T是实现IEntity的bean。Jackson自定义通用解串器

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 
} 

现在我有是这样的:基于类名的实体

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)如何做自动反序列化?

+0

你还可以提供你试图反序列化的JSON吗? – Eugen

+0

这是个好问题,因为“实体”字段根本没有序列化。我最终编写了自己的自定义序列化程序,然后我知道如何反序列化它。我稍后会发布正确答案。但谢谢你的回复。 – termil0r

回答

0

请记住,处理类型信息和处理有效载荷数据是分开的。 所以常规的JSON(de)序列化器根本不应该处理类型:相反,单独使用TypeSerializerTypeDeserializer。这样做是为了防止组合数量的爆炸;有几个TypeSerializer/Deserializer实现(用于不同的包含机制),但是有数百个值(de)序列化器。

自定义(de)序列化程序显然可以在完全控制时打破这种分离。但核心杰克逊有这种分离,你可以看到标准处理程序中的例子。

+0

我没有意识到这一点。谢谢(你的)信息。我会尽快检查。 – termil0r