• SpringCore完整学习教程5,入门级别


    本章从第6章开始

    6. JSON

    Spring Boot提供了三个JSON映射库的集成:

    Jackson是首选的和默认的库。

    6.1. Jackson

    为Jackson提供了自动配置,Jackson是spring-boot-starter-json的一部分。当Jackson在类路径上时,将自动配置ObjectMapper bean。提供了几个配置属性来定制ObjectMapper的配置。

    6.1.1. Custom Serializers and Deserializers

    如果您使用Jackson来序列化和反序列化JSON数据,您可能希望编写自己的JsonSerializer和JsonDeserializer类。自定义序列化器通常通过模块在Jackson中注册,但是Spring Boot提供了另一种@JsonComponent注释,可以更容易地直接注册Spring bean。
    你可以直接在JsonSerializer、JsonDeserializer或KeyDeserializer的实现上使用@JsonComponent注释。你也可以在包含序列化器/反序列化器作为内部类的类上使用它,如下例所示:

    1. @JsonComponent
    2. public class MyJsonComponent {
    3. public static class Serializer extends JsonSerializer {
    4. @Override
    5. public void serialize(MyObject value, JsonGenerator jgen, SerializerProvider serializers) throws IOException {
    6. jgen.writeStartObject();
    7. jgen.writeStringField("name", value.getName());
    8. jgen.writeNumberField("age", value.getAge());
    9. jgen.writeEndObject();
    10. }
    11. }
    12. public static class Deserializer extends JsonDeserializer {
    13. @Override
    14. public MyObject deserialize(JsonParser jsonParser, DeserializationContext ctxt) throws IOException {
    15. ObjectCodec codec = jsonParser.getCodec();
    16. JsonNode tree = codec.readTree(jsonParser);
    17. String name = tree.get("name").textValue();
    18. int age = tree.get("age").intValue();
    19. return new MyObject(name, age);
    20. }
    21. }
    22. }

    我测试一下,MyObject类:

    1. package com.example.demo.demos;
    2. public class MyObject {
    3. String name;
    4. int age;
    5. public MyObject() {
    6. }
    7. public MyObject(String name, int age) {
    8. this.name = name;
    9. this.age = age;
    10. }
    11. public String getName() {
    12. return name;
    13. }
    14. public void setName(String name) {
    15. this.name = name;
    16. }
    17. public int getAge() {
    18. return age;
    19. }
    20. public void setAge(int age) {
    21. this.age = age;
    22. }
    23. }

    测试代码:

    1. @Test
    2. public void testSerialize() throws Exception {
    3. MyObject myObject = new MyObject("John", 30);
    4. ObjectMapper objectMapper = new ObjectMapper();
    5. String json = objectMapper.writeValueAsString(myObject);
    6. System.out.println(json);
    7. }

    结果输出为:

    话说,我每次都测试,各位真不打算关注一下吗?

    测试反序列化:

    1. @Test
    2. public void testDeserialize() throws Exception {
    3. String json = "{\"name\":\"John\",\"age\":30}";
    4. ObjectMapper objectMapper = new ObjectMapper();
    5. MyObject myObject = objectMapper.readValue(json, MyObject.class);
    6. assertEquals("John", myObject.getName());
    7. assertEquals(30, myObject.getAge());

    结果输出:没有问题,这个assertEquals方法就是判断两个参数的值是否相等。

    ApplicationContext中的所有@JsonComponent bean都会自动注册到Jackson。因为@JsonComponent是用@Component做元注释的,所以应用了通常的组件扫描规则。
    Spring Boot还提供了JsonObjectSerializer和JsonObjectDeserializer基类,它们在序列化对象时为标准Jackson版本提供了有用的替代方案。

    上面的例子可以重写为使用JsonObjectSerializer/JsonObjectDeserializer,如下所示:

    1. @JsonComponent
    2. public class MyJsonComponent {
    3. public static class Serializer extends JsonObjectSerializer {
    4. @Override
    5. protected void serializeObject(MyObject value, JsonGenerator jgen, SerializerProvider provider)
    6. throws IOException {
    7. jgen.writeStringField("name", value.getName());
    8. jgen.writeNumberField("age", value.getAge());
    9. }
    10. }
    11. public static class Deserializer extends JsonObjectDeserializer {
    12. @Override
    13. protected MyObject deserializeObject(JsonParser jsonParser, DeserializationContext context, ObjectCodec codec,
    14. JsonNode tree) throws IOException {
    15. String name = nullSafeValue(tree.get("name"), String.class);
    16. int age = nullSafeValue(tree.get("age"), Integer.class);
    17. return new MyObject(name, age);
    18. }
    19. }
    20. }
    6.1.2. Mixins

    Jackson支持mixins,可以用来将额外的注解混合到目标类中已经声明的注解中。Spring Boot的Jackson自动配置将扫描应用程序包中带有@JsonMixin注释的类,并将它们注册到自动配置的ObjectMapper中。注册由Spring Boot的JsonMixinModule执行。

    6.2. Gson

    为Gson提供了自动配置。当Gson在类路径上时,会自动配置一个Gson bean。几个spring.gson。* configuration属性用于自定义配置。为了获得更多的控制,可以使用一个或多个GsonBuilderCustomizer bean。

    6.3. JSON-B

    提供了JSON-B的自动配置。当JSON-B API和实现在类路径上时,将自动配置一个json bean。首选的JSON-B实现是为其提供依赖管理的Apache Johnzon

  • 相关阅读:
    Xcode 真机调试之Unable to install “xxx“,Code: -402653103
    STM32-14-FSMC_LCD
    GBase 8c V3.0.0数据类型——窗口函数
    Java使用多线程做批处理(查询大量数据)
    红米手机/老米手机 adb devices 找不到设备
    华为审核被拒提示: 您的应用存在(最近任务列表隐藏风险活动)的行为,不符合华为应用市场审核标准
    Elasticsearch-IndexTemplate和DynamicTemplate 有什么区别
    html页面广告5秒之后跳过
    vue3通过ref获取子组件defineExpose的数据和方法
    使用Easyocr处理图片遇到的问题合集
  • 原文地址:https://blog.csdn.net/m0_63251896/article/details/134097419