当前位置: 首页 > news >正文

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

本章从第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> {@Overridepublic 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> {@Overridepublic 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;}
}

测试代码:

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

结果输出为:

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

测试反序列化:

 @Testpublic 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> {@Overrideprotected 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> {@Overrideprotected 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

相关文章:

  • 软考系列(系统架构师)- 2012年系统架构师软考案例分析考点
  • 应用案例|基于三维机器视觉的曲轴自动化上下料应用方案
  • Nginx的进程结构实例演示
  • 方案聚焦:高可用的F5分布式云DNS负载均衡
  • 模数转换器-ADC基础
  • Harmony 个人中心(页面交互、跳转、导航、容器组件)
  • How to install mongodb-7.0 as systemd service with podman
  • 【AD9361 数字接口CMOS LVDSSPI】B 并行数据之CMOS
  • C# 递归算法使用简介_常用整理
  • C++初阶-类和对象(中)1
  • PPT文档图片设计素材资源下载站模板源码/织梦内核(带用户中心+VIP充值系统+安装教程)
  • 如何在 uniapp 里面使用 pinia 数据持久化 (pinia-plugin-persistedstate)
  • 【点云】有序/无序点云区别(详细详解)
  • 计算机网络-应用层(3)
  • 10月Java行情 回暖?
  • @jsonView过滤属性
  • “大数据应用场景”之隔壁老王(连载四)
  • Angular Elements 及其运作原理
  • eclipse的离线汉化
  • ES2017异步函数现已正式可用
  • Golang-长连接-状态推送
  • isset在php5.6-和php7.0+的一些差异
  • Java的Interrupt与线程中断
  • Linux gpio口使用方法
  • mysql外键的使用
  • SpingCloudBus整合RabbitMQ
  • Spring核心 Bean的高级装配
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 初识 beanstalkd
  • - 概述 - 《设计模式(极简c++版)》
  • 回顾 Swift 多平台移植进度 #2
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 力扣(LeetCode)56
  • 如何选择开源的机器学习框架?
  • 山寨一个 Promise
  • 说说动画卡顿的解决方案
  • 详解NodeJs流之一
  • 正则表达式
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • #includecmath
  • $$$$GB2312-80区位编码表$$$$
  • (二)Eureka服务搭建,服务注册,服务发现
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (算法)前K大的和
  • (转)ORM
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • .NET性能优化(文摘)
  • @EnableAsync和@Async开始异步任务支持
  • @JSONField或@JsonProperty注解使用
  • @Not - Empty-Null-Blank
  • [202209]mysql8.0 双主集群搭建 亲测可用
  • [BPU部署教程] 教你搞定YOLOV5部署 (版本: 6.2)
  • [C++]命名空间等——喵喵要吃C嘎嘎