杰克逊定制通用解串器

时间:2014-01-12 09:07:49

标签: json rest generics serialization jackson

我需要创建自定义jackson泛型bean反序列化器。 T是实现IEntity的bean。

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)如何基于className自动反序列化实体?

1 个答案:

答案 0 :(得分:0)

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

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