2012-10-19 22 views
1

我想配置一个杰克逊解串器,根据注释字段的目标类型采取不同的行为。创建一个类型意识的杰克逊解串器

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似乎是被禁止的(它会在数据库中保留无用的数据)。 –

+0

要明确一点,你正在将json保存到数据库中?这个方法需要更多的字节,但类型信息似乎没有用处,因为你需要它反序列化。 –

+0

无论持久化的Java对象如何,数据库Document都是一样的。这个想法是保存Id,并将其他对象转换为Id。每个人都有相同的注释。 –