1 回答

TA貢獻(xiàn)1900條經(jīng)驗(yàn) 獲得超5個(gè)贊
好問(wèn)題!是的,這是(以某種方式)可能的。以下公開(kāi)的方法維護(hù)標(biāo)準(zhǔn)序列化行為,同時(shí)在其上添加注釋定義的鍵值對(duì)。
創(chuàng)建自定義批注。我來(lái)稱(chēng)呼它MapAppender
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MapAppender {
String[] keys();
String[] values();
}
如您所見(jiàn),我們定義了鍵值數(shù)組,這些數(shù)組將按索引匹配。
我們被迫使用字段而不是更通用的 ,但這是每個(gè)注釋設(shè)計(jì)。StringObject
創(chuàng)建自定義 .我來(lái)稱(chēng)呼它JsonSerializer<Map>MapAppenderSerializer
public class MapAppenderSerializer
extends StdSerializer<Map>
implements ContextualSerializer {
private static final long serialVersionUID = 1L;
private final String[] keys;
private final String[] values;
// No-arg constructor required for Jackson
MapAppenderSerializer() {
super(Map.class);
keys = new String[0];
values = new String[0];
}
MapAppenderSerializer(
final String[] keys,
final String[] values) {
super(Map.class);
this.keys = keys;
this.values = values;
}
@Override
public void serialize(
final Map value,
final JsonGenerator jsonGenerator,
final SerializerProvider serializerProvider) throws IOException {
// Create a copy Map to avoid touching the original one
final Map hashMap = new HashMap<>(value);
// Add the annotation-specified key-value pairs
for (int i = 0; i < keys.length; i++) {
hashMap.put(keys[i], values[i]);
}
// Serialize the new Map
serializerProvider.defaultSerializeValue(hashMap, jsonGenerator);
}
@Override
public JsonSerializer<?> createContextual(
final SerializerProvider serializerProvider,
final BeanProperty property) {
MapAppender annotation = null;
if (property != null) {
annotation = property.getAnnotation(MapAppender.class);
}
if (annotation != null) {
return new MapAppenderSerializer(annotation.keys(), annotation.values());
}
throw new UnsupportedOperationException("...");
}
}
現(xiàn)在,使用您的類(lèi)示例,使用注釋字段并定義自定義序列化程序BeanMap@MapAppender@JsonSerialize
public class Bean {
public String simpleField;
@MapAppender(keys = {"test1", "test2"}, values = {"value1", "value2"})
@JsonSerialize(using = MapAppenderSerializer.class)
public Map<Object, Object> simpleMap = new HashMap<>();
}
就是這樣。序列化 的實(shí)例Bean
final ObjectMapper objectMapper = new ObjectMapper();
final String string = objectMapper.writeValueAsString(new Bean());
結(jié)果
{"simpleField":null,"simpleMap":{"test2":"value2","test1":"value1"}}
另一個(gè)示例,在序列化之前用值填充Map
final ObjectMapper objectMapper = new ObjectMapper();
final Bean value = new Bean();
value.simpleMap.put("myKey", "myValue");
final String string = objectMapper.writeValueAsString(value);
結(jié)果
{"simpleField":null,"simpleMap":{"test1":"value1","test2":"value2","myKey":"myValue"}}
添加回答
舉報(bào)