springboot学习(四十六) springboot中jackson特殊使用

2024-06-20 08:18

本文主要是介绍springboot学习(四十六) springboot中jackson特殊使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、全局时间配置
在application.yml中配置

spring:jackson:date-format: yyyy-MM-dd HH:mm:ss

或在application.properties中配置

spring.jackson.date-format=yyyy-MM-dd HH:mm:ss

实体中包含时间类型:

/**** @author zhuquanwen* @vesion 1.0* @date 2021/6/14 14:06* @since jdk1.8*/
@Data
@Builder
public class Model {private Integer id;private int age;private String name;private Date createTime;
}

测试controller:

/**** @author zhuquanwen* @vesion 1.0* @date 2021/6/14 14:08* @since jdk1.8*/
@RestController
@RequestMapping("/jackson/type1")
public class JacksonType1Controller {@GetMapping("/res")public Model res() {return Model.builder().id(1).age(12).name("xiaoxiao").createTime(new Date()).build();}
}

测试结果:
在这里插入图片描述
2、使用@JsonFormat为某个属性设置序列化方式
实体:

/**** @author zhuquanwen* @vesion 1.0* @date 2021/6/14 14:06* @since jdk1.8*/
@Data
@Builder
public class Model {private Integer id;private int age;private String name;@JsonFormat(pattern = "yyyy/MM/dd HH:mm:ss")private Date createTime;
}

测试controller:

/**** @author zhuquanwen* @vesion 1.0* @date 2021/6/14 14:08* @since jdk1.8*/
@RestController
@RequestMapping("/jackson/type2")
public class JacksonType2Controller {@GetMapping("/res")public Model res() {return Model.builder().id(1).age(12).name("xiaoxiao").createTime(new Date()).build();}
}

测试结果:
在这里插入图片描述
3、使用@JsonPropertyOrder调整属性的序列化顺序
实体:

/***** @author zhuquanwen* @vesion 1.0* @date 2021/6/14 14:06* @since jdk1.8*/
@Data
@Builder
@JsonPropertyOrder(value={"name", "age"})
public class Model {private Integer id;private int age;private String name;private Date createTime;
}

controller:

/**** @author zhuquanwen* @vesion 1.0* @date 2021/6/14 14:08* @since jdk1.8*/
@RestController
@RequestMapping("/jackson/type3")
public class JacksonType3Controller {@GetMapping("/res")public Model res() {return Model.builder().id(1).age(12).name("xiaoxiao").createTime(new Date()).build();}
}

测试结果:
在这里插入图片描述
4、使用@JsonProperty修改属性名称
实体:

/***** @author zhuquanwen* @vesion 1.0* @date 2021/6/14 14:06* @since jdk1.8*/
@Data
@Builder
public class Model {private Integer id;private int age;//调整序列化的名称@JsonProperty("myName")private String name;private Date createTime;
}

controller:

/**** @author zhuquanwen* @vesion 1.0* @date 2021/6/14 14:08* @since jdk1.8*/
@RestController
@RequestMapping("/jackson/type4")
public class JacksonType4Controller {@GetMapping("/res")public Model res() {return Model.builder().id(1).age(12).name("xiaoxiao").createTime(new Date()).build();}
}

测试结果:
在这里插入图片描述
5、使用@JsonInclude使属性值为null不参与序列化
实体:

/***** @author zhuquanwen* @vesion 1.0* @date 2021/6/14 14:06* @since jdk1.8*/
@Data
@Builder
public class Model {@JsonInclude(value= JsonInclude.Include.NON_NULL)private Integer id;private int age;private String name;private Date createTime;
}

controller:

/**** @author zhuquanwen* @vesion 1.0* @date 2021/6/14 14:08* @since jdk1.8*/
@RestController
@RequestMapping("/jackson/type5")
public class JacksonType5Controller {@GetMapping("/res")public Model res() {return Model.builder().age(12).name("xiaoxiao").createTime(new Date()).build();}
}

测试结果:
在这里插入图片描述
6、使用@JsonIgnore使某个属性不参与序列化
实体:

/***** @author zhuquanwen* @vesion 1.0* @date 2021/6/14 14:06* @since jdk1.8*/
@Data
@Builder
public class Model {@JsonIgnoreprivate Integer id;private int age;private String name;private Date createTime;
}

controller:

/**** @author zhuquanwen* @vesion 1.0* @date 2021/6/14 14:08* @since jdk1.8*/
@RestController
@RequestMapping("/jackson/type6")
public class JacksonType6Controller {@GetMapping("/res")public Model res() {return Model.builder().id(1).age(12).name("xiaoxiao").createTime(new Date()).build();}
}

测试结果:
在这里插入图片描述
7、自定义注解实现序列化和反序列化

将字符串转为数组的序列化处理

package com.iscas.base.biz.test.service;import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.ContextualSerializer;
import com.iscas.common.web.tools.json.JsonUtils;import java.io.IOException;
import java.util.List;
import java.util.Objects;/*** @author zhuquanwen* @version 1.0* @date 2022/6/6 14:04* @since jdk11*/
public class CustomSerialize extends JsonSerializer<String> implements ContextualSerializer {@Overridepublic void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {if (value == null) {gen.writeNull();} else {TypeReference<List<String>> typeReference = new TypeReference<>() {};gen.writeObject(JsonUtils.fromJson(value, typeReference));}}@Overridepublic JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {//判断beanProperty是不是空if (property == null){return prov.findNullValueSerializer(property);}//判断类型是否是Stringif (Objects.equals(property.getType().getRawClass(),String.class)){CustomStrFormatter annotation = property.getAnnotation(CustomStrFormatter.class);if (annotation != null){// 这里可以获取注解中的一些参数String pattern = annotation.pattern();return this;}}return prov.findValueSerializer (property.getType (), property);}
}

将数组反序列化为JSON字符串的处理

package com.iscas.base.biz.test.service;import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.deser.ContextualDeserializer;
import com.iscas.common.web.tools.json.JsonUtils;
import org.apache.commons.lang3.StringUtils;import java.util.ArrayList;
import java.util.List;
import java.util.Objects;/*** @author zhuquanwen* @version 1.0* @date 2022/6/6 14:04* @since jdk11*/
public class CustomDeserialize extends JsonDeserializer<String> implements ContextualDeserializer {@Overridepublic String deserialize(JsonParser p, DeserializationContext ctxt) {try {if (p != null && StringUtils.isNotEmpty(p.getText())) {List<String> strs = new ArrayList<>();JsonToken jsonToken;while (!p.isClosed() && (jsonToken = p.nextToken()) != null && !JsonToken.FIELD_NAME.equals(jsonToken) &&!JsonToken.END_ARRAY.equals(jsonToken)) {strs.add(p.getValueAsString());}return JsonUtils.toJson(strs);} else {return null;}} catch (Exception e) {throw new RuntimeException(e);}}@Overridepublic JsonDeserializer<?> createContextual(DeserializationContext ctxt, BeanProperty property) throws JsonMappingException {//判断beanProperty是不是空if (property == null) {return ctxt.findNonContextualValueDeserializer(property.getType());}//判断类型是否是Stringif (Objects.equals(property.getType().getRawClass(), String.class)) {CustomStrFormatter annotation = property.getAnnotation(CustomStrFormatter.class);if (annotation != null) {// 这里可以获取注解中的一些参数String pattern = annotation.pattern();return this;}}return ctxt.findContextualValueDeserializer(property.getType(), property);}
}

自定义注解

package com.iscas.base.biz.test.service;import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;/*** @author zhuquanwen* @version 1.0* @date 2022/6/6 14:02* @since jdk11*/
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonSerialize(using = CustomSerialize.class)
@JsonDeserialize(using = CustomDeserialize.class)
public @interface CustomStrFormatter {// todo 可以定义格式化方式String pattern() default "";
}

实体中使用自定义注解

  @Data@Accessors(chain = true)public static class TestModel {private String id;private List<String> strs1;@CustomStrFormatterprivate String strs2;}

测试:

@RequestMapping("/test/serial")
@RestController
@Slf4j
public class TestJsonFormatterController {/*** 测试序列化* */@GetMappingpublic TestModel test1() {TestModel testModel = new TestModel();testModel.setId("1").setStrs1(List.of("1", "2", "3")).setStrs2("[\"3\", \"4\"]");return testModel;}@PostMappingpublic String test2(@RequestBody TestModel testModel) {log.info("接收到的testModel:{}", testModel.toString());return "success";}
}

这篇关于springboot学习(四十六) springboot中jackson特殊使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1077593

相关文章

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

《破茧JDBC:MyBatis在SpringBoot中的轻量实践指南》MyBatis是持久层框架,简化JDBC开发,通过接口+XML/注解实现数据访问,动态代理生成实现类,支持增删改查及参数... 目录一、什么是 MyBATis二、 MyBatis 入门2.1、创建项目2.2、配置数据库连接字符串2.3、入

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

Apache Ignite 与 Spring Boot 集成详细指南

《ApacheIgnite与SpringBoot集成详细指南》ApacheIgnite官方指南详解如何通过SpringBootStarter扩展实现自动配置,支持厚/轻客户端模式,简化Ign... 目录 一、背景:为什么需要这个集成? 二、两种集成方式(对应两种客户端模型) 三、方式一:自动配置 Thick

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do