在Springboot + Mybaitis-plus 项目中利用Jackson实现json对java多态的(反)序列化 (2)

父类只需要添加这样一个注解

@JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "animalType", visible = true ) public static class Zoo { private String name; private AnimalTypeEnum animalType; }

子类添加注解

@JsonTypeName("DOG") public static class Dog extends Zoo { private Double speed; } 方法三

在我们的场景中,分类标识符是一个枚举类型。因此,我们希望将所有的子类和标识符名称对应的信息全部放在该枚举类中,使得仅通过枚举类就可以绑定好所有子类和名称之间的关系。

定义一个接口和注解,并在接口上使用了这个注解

@JsonSubTypeEnum.JsonSubTypeAnnotation public interface JsonSubTypeEnum { Class<?> getJsonType(); @Documented @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @interface JsonSubTypeAnnotation { } }

这个接口定义了一个获取子类类信息的方法

public enum AnimalType implements JsonSubTypeEnum { DOG(Dog.class), CAT(Cat.class), ; private final Class<? extends Animal> animalClass; @Override public Class<?> getJsonType() { return this.animalClass; } }

让需要用于分类的枚举实现这个接口,枚举中的animalClass属性,用来记录该标识符对应的子类的类别。

再来看ObjectMapper bean

@Bean @Primary public static ObjectMapper getObjectMapper(){ ObjectMapper objectMapper = new ObjectMapper(); Reflections reflections = new Reflections("com."); //获取所有带有自定义注解的类 Set<Class<?>> classSet = reflections.getTypesAnnotatedWith(JsonSubTypeEnum.JsonSubTypeAnnotation.class); //将其中的枚举类拿出来处理 for (Class<?> enumTyp : classSet) { if (!enumTyp.isEnum()) { continue; } final Object[] enumConstants = enumTyp.getEnumConstants(); for (Object e : enumConstants) { if (e instanceof JsonSubTypeEnum) { //将每个子类和标识符绑定注册进入objectMapper final Class<?> subType = ((JsonSubTypeEnum) e).getJsonType(); final String name = ((Enum<?>) e).name(); objectMapper.registerSubtypes(new NamedType(subType, name)); } } } //这里是将我们定义好的objectMapper set 进 Mybaitis-plus的Jackson处理器中,从而使得MP也可以 顺利的进行反序列化 JacksonTypeHandler.setObjectMapper(objectMapper); return objectMapper; }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzzgzf.html