有没有办法动态设置@JsonProperty 注释,如:
class A {
@JsonProperty("newB") //adding this dynamically
private String b;
}
或者我可以简单地重命名实例的字段吗?如果是这样,建议我一个想法。另外,以什么方式ObjectMapper
可以与序列化一起使用?
有没有办法动态设置@JsonProperty 注释,如:
class A {
@JsonProperty("newB") //adding this dynamically
private String b;
}
或者我可以简单地重命名实例的字段吗?如果是这样,建议我一个想法。另外,以什么方式ObjectMapper
可以与序列化一起使用?
假设您的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"
}
这是一个很晚的答案,但如果它对您或其他人有帮助,您应该能够在运行时更改注释。检查此链接:
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
IE:
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));
}