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

简介: 本文是Spring Core学习教程的第五部分,深入探讨了Spring Boot对JSON的支持,包括Jackson、Gson和JSON-B三个JSON映射库的集成,以及如何自定义序列化器、反序列化器和使用Mixins。

本章从第6章开始

6. JSON

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

  • Gson

  • Jackson

  • JSON-B

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注释。你也可以在包含序列化器/反序列化器作为内部类的类上使用它,如下例所示:

@JsonComponent
public class MyJsonComponent {

    public static class Serializer extends JsonSerializer<MyObject> {

        @Override
        public void serialize(MyObject value, JsonGenerator jgen, SerializerProvider serializers) throws IOException {
            jgen.writeStartObject();
            jgen.writeStringField("name", value.getName());
            jgen.writeNumberField("age", value.getAge());
            jgen.writeEndObject();
        }

    }

    public static class Deserializer extends JsonDeserializer<MyObject> {

        @Override
        public MyObject deserialize(JsonParser jsonParser, DeserializationContext ctxt) throws IOException {
            ObjectCodec codec = jsonParser.getCodec();
            JsonNode tree = codec.readTree(jsonParser);
            String name = tree.get("name").textValue();
            int age = tree.get("age").intValue();
            return new MyObject(name, age);
        }

    }

}

我测试一下,MyObject类:

package com.example.demo.demos;

public class MyObject {
    String name;
    int age;

    public MyObject() {
    }

    public MyObject(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

测试代码:

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

结果输出为:

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

测试反序列化:

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

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

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

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

@JsonComponent
public class MyJsonComponent {

    public static class Serializer extends JsonObjectSerializer<MyObject> {

        @Override
        protected void serializeObject(MyObject value, JsonGenerator jgen, SerializerProvider provider)
                throws IOException {
            jgen.writeStringField("name", value.getName());
            jgen.writeNumberField("age", value.getAge());
        }

    }

    public static class Deserializer extends JsonObjectDeserializer<MyObject> {

        @Override
        protected MyObject deserializeObject(JsonParser jsonParser, DeserializationContext context, ObjectCodec codec,
                JsonNode tree) throws IOException {
            String name = nullSafeValue(tree.get("name"), String.class);
            int age = nullSafeValue(tree.get("age"), Integer.class);
            return new MyObject(name, age);
        }

    }

}
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

目录
相关文章
|
1天前
|
Kubernetes 安全 Java
springCore完整学习教程2,入门级别
本文是Spring Core学习教程的第二部分,深入讲解了Spring Boot中的外部化配置,包括配置文件的加载规则、使用配置文件、配置属性的加密、YAML的使用、配置随机值、系统环境属性的配置,以及@ConfigurationProperties注解的详细使用和与@Value注解的比较。
8 2
springCore完整学习教程2,入门级别
|
1天前
|
JSON Java API
SpringCore 完整学习教程1,入门级别
本文是Spring Core的学习教程第一部分,涵盖了SpringApplication的使用、启动失败处理、延迟初始化、自定义SpringApplication、事件监听、Web环境、访问应用程序参数、使用ApplicationRunner或CommandLineRunner、应用程序退出码以及管理应用程序可用性状态等基本概念。
9 1
SpringCore 完整学习教程1,入门级别
|
1天前
|
Java 应用服务中间件 数据库连接
SpringCore完整学习教程4,入门级别
本文是Spring Core学习教程的第四部分,详细介绍了Spring Boot中的日志记录功能,包括日志格式、控制台输出、文件输出、日志轮换、日志级别设置、日志组定义、使用日志关闭钩子、自定义日志配置以及Logback扩展等。
6 1
SpringCore完整学习教程4,入门级别
|
1天前
|
前端开发 Java 测试技术
SpringCore完整学习教程6,入门级别
本文是Spring Core学习教程的第六部分,涵盖了Spring Boot中的任务执行和调度、异步处理,以及使用@SpringBootTest进行集成测试的多种方式,包括使用MockMvc和WebTestClient进行模拟测试和使用随机端口启动服务器进行测试。
8 2
|
1天前
|
IDE Java Maven
SpringCore完整学习教程7,入门级别
如何创建Spring Boot的自定义自动配置,包括理解自动配置类、定位自动配置候选、使用条件注解、测试自动配置以及创建自定义启动器的完整教程。
8 2
|
域名解析 Ubuntu Linux
从零开始:云服务器构建网站的完全指南
从零开始:云服务器构建网站的完全指南 国内华为云、阿里云、腾讯云等看你的选择; 可以选择Linux:CentOS、Ubuntu这些系统版本,更稳定; 服务器控制台,安全组可以添加或改端口; 如果,构建网站需要备案管理,建议购买适合的服务器
195 3
|
机器学习/深度学习 弹性计算 编解码
阿里云服务器产品介绍(配置选择及新手入门教程)
阿里云服务器是什么?阿里云服务器如何使用?阿里云服务器配置怎么选择及阿里云服务器新手入门教程
485 0
|
弹性计算 物联网 应用服务中间件
初学者ECS使用心得
实现的过程为:外网用户通过网址访问阿里云云服务器中我们创建的实例对象,将请求交给nginx后发现不能处理就通过配置的反向代理交给TomCat处理index.html的请求。
144 1
DT
|
物联网 Shell 网络安全
阿里云服务器的编程配置及使用感受
在这十天的阿里云使用中,我学会了很多,如服务器的基础配置,服务器的免密登录,在本地电脑与服务器ssh传输文件等,可以说是爱上了阿里云,很幸运可以遇到这款优秀的服务器,提高生产力之必备首选。
DT
263 0
阿里云服务器的编程配置及使用感受
|
弹性计算 关系型数据库 MySQL
从零到一上手玩转云服务器
学习对ECS实例简单的管理操作,如何搭建LAMP环境
174 1
从零到一上手玩转云服务器