使用 FasterXML Jackson 的注解 JsonTypeInfo
和 JsonSubTypes
可以实现多态类型的处理。在你的 User
类上,你可以添加这些注解来指示 Jackson 如何处理多态类型。
以下是使用 JsonTypeInfo
和 JsonSubTypes
注解的 User
类的修改:
import com.fasterxml.jackson.annotation.JsonSubTypes;import com.fasterxml.jackson.annotation.JsonTypeInfo;@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")@JsonSubTypes({@JsonSubTypes.Type(value = AdminUser.class, name = "admin"),@JsonSubTypes.Type(value = RegularUser.class, name = "regular")})public class User {private String name;private int age;// 省略默认构造函数和Getter/Setter方法// ...}
在这里,JsonTypeInfo
的 use
属性设置为 JsonTypeInfo.Id.NAME
,property
属性指定了一个标识多态类型的属性名称。JsonSubTypes
注解用于指定子类型,其中 Type
属性指定子类型的类,而 name
属性指定标识该子类型的字符串。这里假设有两个子类型 AdminUser
和 RegularUser
。
接下来,创建两个子类型类 AdminUser
和 RegularUser
:
public class AdminUser extends User {private String role;// 省略默认构造函数和Getter/Setter方法// ...}
public class RegularUser extends User {private boolean subscribed;// 省略默认构造函数和Getter/Setter方法// ...}
在这里,AdminUser
和 RegularUser
都继承自 User
类,以展示多态的概念。
现在,你可以使用 ObjectMapper
将包含多态类型信息的 JSON 转换为对应的对象,也可以将对象转换为 JSON 字符串。例如:
import com.fasterxml.jackson.databind.ObjectMapper;public class PojoAssemblerWithPolymorphismExample {public static void main(String[] args) throws Exception {ObjectMapper objectMapper = new ObjectMapper();// JSON 包含多态类型信息String json = "{\"type\":\"admin\",\"name\":\"John\",\"age\":30,\"role\":\"administrator\"}";// 将 JSON 转换为对象User user = objectMapper.readValue(json, User.class);// 输出对象信息System.out.println(user.getClass().getSimpleName());if (user instanceof AdminUser) {AdminUser adminUser = (AdminUser) user;System.out.println("Role: " + adminUser.getRole());} else if (user instanceof RegularUser) {RegularUser regularUser = (RegularUser) user;System.out.println("Subscribed: " + regularUser.isSubscribed());}// 创建对象AdminUser adminUser = new AdminUser();adminUser.setName("Alice");adminUser.setAge(25);adminUser.setRole("moderator");// 将对象转换为 JSON 字符串String jsonFromUser = objectMapper.writeValueAsString(adminUser);// 输出转换的 JSON 字符串System.out.println(jsonFromUser);}}
在这个例子中,JSON 字符串包含了多态类型信息,JsonTypeInfo
和 JsonSubTypes
注解告诉 Jackson 如何处理这种多态情况。通过使用 ObjectMapper
,你可以轻松地将 JSON 转换为具体的对象,反之亦然。这在处理复杂的 JSON 数据结构时非常有用。