在Java上创建一个通用的Jackson JSON反序列化器

时间:2015-07-28 03:18:24

标签: java json generics jackson deserialization

问题

我的一些JSON对象有一个属性名称“id”,所以我想创建一个通用的反序列化器,它调用特定的方法从数据库中检索POJO。它也必须基于关系(字段)的上下文,而不是类。

即。反序列化程序(ParentA.sameChild)<>解串器(ParentB.sameChild)

首先尝试:@Annotations

class Parent {
   @Deserializer(using=MyIdDeserializer<Child>.class)
   public Child myChild;
}

class MyIdDeserializer<T extends ChildDAO> extends JsonDeserializer<T> {
   public T deserialize(JsonParser jp, DeserializationContext ctx) throws IOException, JsonProcessingException {
        JsonNode node = jp.getCodec().readTree(jp);
        Integer id = node.get("id").asInt();
        return T.find(id);
   }
}

问题1:知道如何将类Child 传递给方法范围 T deserialize()

问题2:还有其他策略可以解决这个问题吗?

我的通用“Serializer”

的示例
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonSerialize(using=JsonSimpleName.SimpleNameSerializer.class)
public @interface JsonSimpleName {

    public static class SimpleNameSerializer extends JsonSerializer<JsonSimpleNameI> {
        @Override
        public void serialize(JsonSimpleNameI value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
            jgen.writeStartObject();
            jgen.writeNumberField("id", value.jsonId());
            jgen.writeStringField("name", value.jsonName());
            jgen.writeEndObject();
        }
    }
}

public interface JsonSimpleNameI {
    public Integer  jsonId();
    public String   jsonName();
}

现在我可以在实现JsonSimpleNameI的类中使用简单的注释:

@JsonSimpleName
protected MyClass myClass;

0 个答案:

没有答案