Jackson Introductory Part 7-serialización y deserialización JSON bajo la relación de herencia de clases JsonTypeInfo

Jackson es el marco de procesamiento de datos JSON predeterminado de Spring Boot (SpringBoot), pero no depende de ninguna biblioteca de Spring. Algunos amigos piensan que Jackson solo se puede usar en el marco de Spring, pero no es así. No existe tal restricción. Proporciona muchos métodos de procesamiento de datos JSON y anotaciones , así como funciones como API de transmisión, modelo de árbol, enlace de datos y conversión de tipos de datos complejos. Aunque es simple y fácil de usar, definitivamente no es un juguete pequeño. Para obtener más contenido, escribiré una serie de 5 a 10 artículos. Por favor, continúe prestándome atención.

Este artículo es el séptimo de una serie de artículos y es principalmente para que usted presente cómo implementar la serialización JSON y deserialización de la clase padre y la subclase en el caso de la herencia de clases Java.

Uno, la construcción de objetos de relación de herencia.

Primero construya una clase ClsShape para representar la forma.

public class ClsShape {
}

Construya una clase ClsCircle para representar un círculo. Y agregó una serie de anotaciones lombok, Data significa que proporciona métodos como get, set, toString, hashCode; las anotaciones EqualsAndHashCode se utilizan en las clases de palabras heredadas; AllArgsConstructor y NoArgsConstructor proporcionan métodos de construcción de parámetros completos y sin parámetros, respectivamente.

@Data
@EqualsAndHashCode(callSuper = true)
@AllArgsConstructor
@NoArgsConstructor
public class ClsCircle extends ClsShape {
  Integer radius;    //弧度
}

Construya una clase rectangular ClsRectangle con variables miembro ancho y alto.

@Data
@EqualsAndHashCode(callSuper = true)
@AllArgsConstructor
@NoArgsConstructor
public class ClsRectangle extends ClsShape {
  private Integer width;
  private Integer height;
}

Construya una clase ClsView para representar la pantalla. Hay muchas formas ClsShape en la pantalla, así que use un paquete List.

@Data
public class ClsView {
  private List<ClsShape> shapes;
}

Dos, prueba de serialización y deserialización

Después de escribir la clase de forma básica y la clase de pantalla, se usa el siguiente código para completar: el proceso de serialización del objeto en la cadena Json y el código de proceso de la deserialización de la cadena Json en el objeto Java.

@Test
void testJSON2Object() throws IOException {
  ClsRectangle rectangle = new ClsRectangle(7,9); //构建正方形对象
  ClsCircle circle = new ClsCircle(8); //构建长方形对象
  List<ClsShape> shapes = new ArrayList<>();  //List<多种形状>
  shapes.add(circle);
  shapes.add(rectangle);
  ClsView view = new ClsView();  //将List放入画面View
  view.setShapes(shapes);

  ObjectMapper mapper = new ObjectMapper();
  System.out.println("-- 序列化 --");
  String jsonStr = mapper.writeValueAsString(view);
  System.out.println(jsonStr);

  System.out.println("-- 反序列化 --");
  ClsView deserializeView = mapper.readValue(jsonStr, ClsView.class);
  System.out.println(deserializeView);

}

Puede ver que el resultado final en la consola es el siguiente: El proceso de serialización es normal, pero se informó un error durante la deserialización.

-- 序列化 --
{"shapes":[{"radius":8},{"width":7,"height":9}]}

-- 反序列化 --
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "radius" (class com.example.demo.javabase.ClsShape), not marked as ignorable (0 known properties: ])
 at [Source: (String)"{"shapes":[{"radius":8},{"width":7,"height":9}]}"; line: 1, column: 23] (through reference chain: com.example.demo.javabase.ClsView["shapes"]->java.util.ArrayList[0]->com.example.demo.javabase.ClsShape["radius"])

La razón principal para lanzar una excepción es que cuando solíamos recibir el resultado de la deserialización List<ClsShape>, el programa Java no sabía claramente si la forma de ClsShape era un ClsCircle circular o un ClsRectangle cuadrado . Por lo tanto, la cadena no se puede deserializar correctamente en un objeto java.

Tres, la @JsonTypeInfoanotación se agrega a la definición de la clase principal

Para resolver el problema de deserialización del objeto de relación de herencia anterior, jackson nos proporciona la anotación JsonTypeInfo, que se puede agregar a la definición de la clase principal.

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)
public class ClsShape {
}

Después de agregar @JsonTypeInfoanotaciones a la definición de la clase principal , los resultados de salida de la serialización y deserialización son los siguientes.

-- 序列化 --
{"shapes":[
{"@class":"com.example.demo.javabase.ClsCircle","radius":8},
{"@class":"com.example.demo.javabase.ClsRectangle","width":7,"height":9}
]}
-- 反序列化 --
ClsView(shapes=[ClsCircle(radius=8), ClsRectangle(width=7, height=9)])

Vale la pena señalar que en la cadena java serializada, cada objeto Json contiene un nuevo atributo @class, que también es la clase en la que el objeto se puede deserializar en el objeto java correcto (valor @class) bajo la relación de herencia La clave del objeto) .

En cuarto lugar, la @JsonTypeInfoanotación se agrega a la variable miembro que contiene la clase principal.

@JsonTypeInfoLas anotaciones se pueden agregar no solo a la definición de la clase principal, sino también a las variables miembro que contienen la clase principal. Los resultados de la serialización y deserialización son los mismos que los de la tercera sección.

@Data
public class ClsView {
  @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)
  private List<ClsShape> shapes;
}

Bienvenido a seguir mi blog, hay muchas colecciones boutique.

  • Este artículo se reproduce con una indicación de la fuente (se debe adjuntar la conexión y el texto no se puede reproducir únicamente): Blog de Letter Brother .

Si crees que es útil para ti, ¡dale me gusta y compártelo! ¡Tu apoyo es mi inagotable motivación creativa! . Además, el autor ha publicado el siguiente contenido de alta calidad recientemente y espero su atención.

Supongo que te gusta

Origin blog.csdn.net/hanxiaotongtong/article/details/108841591
Recomendado
Clasificación