Java 动态添加fasterxml注释?

Java 动态添加fasterxml注释?,java,serialization,jackson,fasterxml,Java,Serialization,Jackson,Fasterxml,有没有办法动态设置@JsonProperty注释,如: class A { @JsonProperty("newB") //adding this dynamically private String b; } 或者我可以简单地重命名实例的字段吗?如果是的话,给我一个建议。 另外,ObjectMapper可以以何种方式用于序列化 假设您的POJO类如下所示: 现在,您必须创建接口: 简单用法: 以上程序打印: 这是一个非常晚的答案,但如果它对您或其他人有帮助,您应该

有没有办法动态设置@JsonProperty注释,如:

class A {

    @JsonProperty("newB") //adding this dynamically
    private String b;

}
或者我可以简单地重命名实例的字段吗?如果是的话,给我一个建议。
另外,
ObjectMapper
可以以何种方式用于序列化

假设您的
POJO
类如下所示:

现在,您必须创建接口:

简单用法:

以上程序打印:


这是一个非常晚的答案,但如果它对您或其他人有帮助,您应该能够在运行时更改注释。检查此链接:

修改注释可能有点混乱,我更喜欢其他选项

Mixin是一个很好的静态选项,但如果您需要在运行时更改属性,则可以使用自定义序列化程序(或反序列化程序)。然后向您选择的ObjectMapper注册序列化程序(现在通过Jackson免费提供json/xml等编写格式)。以下是一些其他示例:

自定义序列化程序:

自定义反序列化程序:

i、 e:

A类{
//@JsonProperty(“newB”)//动态添加此
b串;
}
类ASerializer扩展了StdSerializer{
公共ASerializer(){
这个(空);
}
公用空调器(a类){
超级(a);
}
@凌驾
public void serialize(A、JsonGenerator gen、SerializerProvider提供程序)引发IOException{
如果(a==null){
writeNull将军();
}否则{
gen.writeStartObject();
writeStringField将军(简称“newB”,a.b.);
writeEndObject将军();
}
}
}
@试验
public void test()引发JsonProcessingException{
A=新的A();
a、 b=“bbb”;
字符串exp=“{\'newB\”:\'bbb\“}”;
ObjectMapper mapper=新的ObjectMapper();
SimpleModule=新的SimpleModule();
addSerializer(A.class,新的ASerializer());
映射器注册表模块(模块);
assertEquals(exp,mapper.writeValueAsString(a));
}

阅读有关MixIn的内容-。还可以看到本教程:我看到了整个类与另一个JSON或类似文件的映射,而我只需要更改要修改的类的一个特定字段,如@JsonProperty,如果我遗漏了您的任何内容,请原谅link@Jayanth您忽略了这样一个事实,即您可以以任何方式定义mix-in,并且只包括那些方法、字段、,要用作替代的注释。因此,例如,您的
类A
可以在类中混合用于一个或多个目标类,以使字段“b”序列化为“newB”。@StaxMan序列化的结果可以是对象,也可以是
writeValueAsString()
@Jayanth()中的
字符串。如果您的意思是mix-in的字段或方法签名是否必须相同,则是。但听起来您可能在问其他问题。如果类中有多个字段,是否也需要在接口中添加该字段?您必须只提供这些要更改其配置的方法。如果你只想更新一个属性,你只需要提供一个方法。Michael,谢谢你的回答,但我的目的是通过修改字段名而不是字符串来获取相同的对象,你能给我一个解决方案吗?对不起,我不理解你的问题。你能更新你的问题并提供一个例子来说明你想做什么吗?是的,使用MixIn的我实际上可以按照你说的那样完成这个过程,但是我能处理object
pojoA
并从
writeValueAsString()
返回MixIn
pojoA
而不是
字符串吗
class PojoA {

    private String b;

    // getters, setters
}
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"
}
    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));
    }