有没有办法动态设置@JsonProperty注释:
class A {
@JsonProperty("newB") //adding this dynamically
private String b;
}
或者我可以简单地重命名实例的字段吗?如果是这样,建议我一个想法。
另外,ObjectMapper
以何种方式与序列化一起使用?
答案 0 :(得分:2)
假设您的POJO
类看起来像这样:
class PojoA {
private String b;
// getters, setters
}
现在,您必须创建MixIn界面:
interface PojoAMixIn {
@JsonProperty("newB")
String getB();
}
简单用法:
PojoA pojoA = new PojoA();
pojoA.setB("B value");
System.out.println("Without MixIn:");
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(pojoA));
System.out.println("With MixIn:");
ObjectMapper mapperWithMixIn = new ObjectMapper();
mapperWithMixIn.addMixInAnnotations(PojoA.class, PojoAMixIn.class);
System.out.println(mapperWithMixIn.writerWithDefaultPrettyPrinter().writeValueAsString(pojoA));
以上程序打印:
Without MixIn:
{
"b" : "B value"
}
With MixIn:
{
"newB" : "B value"
}
答案 1 :(得分:0)
这是一个很晚的答案,但是,如果对您或其他人有帮助,您应该可以在运行时更改批注。检查此链接:
https://www.baeldung.com/java-reflection-change-annotation-params
修改注释可能有点混乱,我更喜欢其他选项。
Mixin是一个很好的静态选项,但是如果您需要在运行时更改属性,则可以使用自定义序列化程序(或反序列化程序)。然后向您选择的ObjectMapper注册序列化程序(现在通过Jackson免费提供了json / xml之类的书写格式)。以下是一些其他示例:
自定义序列化程序: https://www.baeldung.com/jackson-custom-serialization
自定义解串器: https://www.baeldung.com/jackson-deserialization
即:
class A {
// @JsonProperty("newB") //adding this dynamically
String b;
}
class ASerializer extends StdSerializer<A> {
public ASerializer() {
this(null);
}
public ASerializer(Class<A> a) {
super(a);
}
@Override
public void serialize(A a, JsonGenerator gen, SerializerProvider provider) throws IOException {
if (a == null) {
gen.writeNull();
} else {
gen.writeStartObject();
gen.writeStringField("newB", a.b);
gen.writeEndObject();
}
}
}
@Test
public void test() throws JsonProcessingException {
A a = new A();
a.b = "bbb";
String exp = "{\"newB\":\"bbb\"}";
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(A.class, new ASerializer());
mapper.registerModule(module);
assertEquals(exp, mapper.writeValueAsString(a));
}