
JS
Jackson:如何在不修改 POJO 的情况下向 JSON 添加自定义属性
在开发过程中,我们经常会遇到需要向 JSON 添加一些自定义属性的情况。然而,如果直接修改原始的 POJO 类,在后续的代码维护和升级中可能会变得非常困难。那么有没有一种方法,能够在不修改 POJO 的情况下,向 JSON 添加我们需要的属性呢?答案是肯定的,通过使用 Jackson 库,我们可以实现这个需求。Jackson 是一个用于处理 JSON 数据的开源库,它提供了灵活的方式来处理 JSON 数据的序列化和反序列化。在这篇文章中,我们将学习如何使用 Jackson 来向 JSON 添加自定义属性。使用 @JSonAnyGetter 和 @JSonAnySetter 注解Jackson 提供了 @JSonAnyGetter 和 @JSonAnySetter 注解,它们可以帮助我们在不修改原始 POJO 类的情况下,向 JSON 添加自定义属性。@JSonAnyGetter 注解可以用于一个 getter 方法上,用来指示 Jackson 应该将返回的属性添加到 JSON 中。示例代码如下:Javapublic class Person { private String name; private int age; private Map<String, Object> additionalProperties = new HashMap<>(); public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } @JSonAnyGetter public Map<String, Object> getAdditionalProperties() { return additionalProperties; }}在上面的代码中,我们定义了一个名为 additionalProperties 的 Map 对象,用来存储自定义的属性。通过 @JSonAnyGetter 注解,Jackson 将会将 additionalProperties 中的属性添加到生成的 JSON 中。接下来,我们需要使用 @JSonAnySetter 注解来实现向 additionalProperties 中添加属性的功能。示例代码如下:Javapublic class Person { // ... @JSonAnySetter public void setAdditionalProperty(String key, Object value) { additionalProperties.put(key, value); }}在上面的代码中,我们定义了一个名为 setAdditionalProperty 的方法,通过 @JSonAnySetter 注解,Jackson 将会将 JSON 中的自定义属性添加到 additionalProperties 中。案例代码为了更好地理解如何使用 @JSonAnyGetter 和 @JSonAnySetter 注解来向 JSON 添加自定义属性,下面我们来看一个完整的案例代码。Javaimport com.fasterXML.jackson.annotation.JSonAnyGetter;import com.fasterXML.jackson.annotation.JSonAnySetter;import com.fasterXML.jackson.databind.ObjectMapper;import Java.util.HashMap;import Java.util.Map;public class JSonCustomPropertyExample { public static void mAIn(String[] args) throws Exception { ObjectMapper objectMapper = new ObjectMapper(); Person person = new Person("John Doe", 30); person.setAdditionalProperty("emAIl", "john.doe@example.com"); person.setAdditionalProperty("address", "123 MAIn St"); String JSon = objectMapper.writeValueAsString(person); System.out.println(JSon); } public static class Person { private String name; private int age; private Map<String, Object> additionalProperties = new HashMap<>(); public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } @JSonAnyGetter public Map<String, Object> getAdditionalProperties() { return additionalProperties; } @JSonAnySetter public void setAdditionalProperty(String key, Object value) { additionalProperties.put(key, value); } }}在上面的案例中,我们创建了一个 Person 类,其中包含了 name 和 age 两个属性。通过调用 setAdditionalProperty 方法,我们向 additionalProperties 中添加了 emAIl 和 address 两个自定义属性。然后,使用 ObjectMapper 对象将 Person 对象序列化为 JSON 字符串,并打印输出结果。运行上面的代码,我们将会得到如下的 JSON 字符串:JSon{ "name" : "John Doe", "age" : 30, "emAIl" : "john.doe@example.com", "address" : "123 MAIn St"}通过上面的案例,我们可以看到,通过使用 @JSonAnyGetter 和 @JSonAnySetter 注解,我们成功地向 JSON 中添加了自定义属性,而不需要修改原始的 POJO 类。在本文中,我们学习了如何使用 Jackson 库来在不修改 POJO 的情况下,向 JSON 添加自定义属性。通过使用 @JSonAnyGetter 和 @JSonAnySetter 注解,我们可以轻松地实现这个需求。这种方式不仅能够提高代码的可维护性和可扩展性,还能够减少代码的修改量,使得后续的代码维护更加方便。参考资料:- [Jackson - Custom Properties](https://www.baeldung.com/jackson-custom-properties)- [Jackson - @JSonAnyGetter](https://fasterXML.github.io/jackson-annotations/Javadoc/2.10/com/fasterXML/jackson/annotation/JSonAnyGetter.html)- [Jackson - @JSonAnySetter](https://fasterXML.github.io/jackson-annotations/Javadoc/2.10/com/fasterXML/jackson/annotation/JSonAnySetter.html)Copyright © 2025 IZhiDa.com All Rights Reserved.
知答 版权所有 粤ICP备2023042255号