我必须上课:
public class CustomClass {
@JsonProperty("Value")
private boolean value;
@JsonProperty("OtherObjects")
private List<OtherObjects> objects;
@JsonProperty("Num")
private int num;
@JsonIgnore
public String dynamicParameterKey;
}
在反序列化中,我得到了这个对象,作为嵌套对象的一部分,每个嵌套对象都有反序列化和序列化的规则。 但是在序列化时我需要这个对象添加另一个字段“dynamicParamterKey”作为它的键,“value”作为它的值
我无法在编译时添加字段,因为密钥是动态的。
所以我需要做的是将对象序列化为常规对象并添加此自定义字段。
这个类是一大堆类的一部分所以我需要尽可能地封装它(不使用自定义反序列化器并将其添加到ObjectMapper),我可以使用treeMap或者其他东西,因为它是一个发给我的一个更大的json的一部分。
我怎样才能实现这一目标?
答案 0 :(得分:3)
经过一些调查并从很多来源收集零件后,我提出了这个解决方案:
您需要创建类实现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);
}
}