当前位置: 首页 > 知识库问答 >
问题:

fasterxml注释的动态添加?

卢皓轩
2023-03-14

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

class A {

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

}

或者我可以简单地重命名实例的字段吗?如果是这样,请给我一个主意。此外,ObjectMapper可以以何种方式与序列化一起使用?

共有2个答案

楚弘益
2023-03-14

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

https://www.baeldung.com/java-reflection-change-annotation-params

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

混合是一个很好的静态选项,但是如果您需要在运行时更改属性,您可以使用自定义序列化器(或反序列化器)。然后使用您选择的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));
    }
邴子实
2023-03-14

假设您的< code>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"
}
 类似资料:
  • 低于我的情况。 我有一个处理文本的类文本处理器。我需要在这样的文本中找到相关的引用,然后用斯坦福大学的OpenIE工具提取信息。我使用这两条管道: “标记化、ssplit、pos、引理、ner、解析、提及、coref”表示共指。 和 用于信息提取的“标记化、ssplit、pos、引理、depparse、natlog、openie”。 单独使用它们来分析单个文本需要很多时间,但目前我必须这样做,因为

  • 我有一个json,它在一个领域模型中通过annotaion@SerializedName使用gson进行转换。 但有时在json中,有一个未知的键,我想将它编为字符串。 我在列表woList=gson.fromjson(parentArray,new typeToken>(){}.getType())上序列化了它;

  • 我正在开发一个从Azure服务总线读取消息的应用程序。该应用程序是使用spring boot、spring jms和Qpid jms客户端创建的。我能够正确地从队列中读取消息,没有任何问题。PFB我用来阅读信息的代码。 问题是,对于不同的环境,我们有不同的目的地,例如用于开发的测试、用于qa的测试qa和用于生产的测试产品,所有这些值都作为azure提供。queueName在不同的应用程序-(ENV

  • 课程对象不包装在标记中 某些属性是属性 我需要如何注释我的对象以使FasterXML反序列化这个XML?

  • 问题内容: 我正在尝试开发用于数据库同步的ORM,并决定尝试一下Java。我有一个库定义了这样的同步注释 在android项目中,我使用此批注标记模型类 经过一番调查,最终编写了一种“加载程序”方法,该方法可以发现当前apk中的模型类。它应该检索所有标记为“ Synchronized”的类,但是这里的问题是getAttribute(Synchronized.class)不起作用。手动迭代注释并搜索