2016-11-15 64 views
0

我有下面的類:如何序列化對象與jakcson和動態字段添加到它

public class CustomClass { 

    @JsonProperty("Value") 
    private boolean value; 
    @JsonProperty("OtherObjects") 
    private List<OtherObjects> objects; 
    @JsonProperty("Num") 
    private int num; 
    @JsonIgnore 
    public String dynamicParameterKey; 
} 

在反序列化我得到這個對象,嵌套對象的一部分,每個都有它的規則反序列化和序列化的。 但是在序列化我需要此對象添加另一個字段與「dynamicParamterKey」,因爲它的關鍵和「價值」,因爲它的值

我不能在編譯時添加一個字段,因爲密鑰是動態的。

所以我需要做的是序列化對象爲常規,並添加此自定義字段。

這個類是一大堆類的一部分,所以我需要儘可能地封裝它(不使用自定義的反序列化器並將它添加到ObjectMapper中),並且我可以使用treeMap或其他東西,因爲它是這是發送給我的更大的json的一部分。

我該如何實現這個目標?

回答

2

經過一番調查和收集部分從大量的來源,我想出了這個解決方案:

你需要讓你的類實現JsonSerializable這樣就可以使一個自定義序列化。

現在,因爲你想使用默認的序列化,只添加到它,你需要使用BeanSerializerFactory來做到這一點。

所以它會是這個樣子:

public class CustomClass implements JsonSerializable { 

    @JsonProperty("Value") 
    private boolean value; 
    @JsonProperty("OtherObjects") 
    private List<OtherObjects> objects; 
    @JsonProperty("Num") 
    private int num; 
    @JsonIgnore 
    public String dynamicParameterKey; 


//We do this so Jackson will know how to serialize with dynamic parameter key 
@Override 
public void serialize(JsonGenerator gen, SerializerProvider provider) throws IOException { 
    gen.writeStartObject(); 

    //use default serializer 
    JavaType javaType = provider.constructType(RegulationAnswer.class); 
    BeanDescription beanDesc = provider.getConfig().introspect(javaType); 
    JsonSerializer<Object> serializer = BeanSerializerFactory.instance.findBeanSerializer(provider, 
      javaType, 
      beanDesc); 
    serializer.unwrappingSerializer(null).serialize(this, gen, provider); 

    //add custom fields 
    gen.writeBooleanField(dynamicParameterKey, isChecked()); 

    gen.writeEndObject(); 
} 

@Override 
public void serializeWithType(JsonGenerator gen, SerializerProvider serializers, TypeSerializer typeSer) throws IOException { 
     serialize(gen, serializers); 
} 
}