文章目录
前言
前端在给我发送请求的时候一般包含三个部分url,header,body。那么就会涉及我们后端如何接收这些请求参数并且我们处理完毕参数后前端又如何接收参数
通过url传递参数一般情况我们不需要序列化/反序列化处理,而通过body传递的参数我们就需要**反序列化**
处理。处理完毕后参数返回给前端就是**序列化**
一、配置文件
在rouyi-admin的application.yml文件中配置了如下内容
yaml
spring:
jackson:
# 日期格式化
date-format: yyyy-MM-dd HH:mm:ss
serialization:
# 格式化输出
indent_output: false
# 忽略无法转换的对象
fail_on_empty_beans: false
deserialization:
# 允许对象忽略json中不存在的属性
fail_on_unknown_properties: false
二、配置类
位于package com.ruoyi.framework.config添加如下配置并且交给bean管理
java
@Slf4j
@Configuration
public class JacksonConfig {
@Bean
public Jackson2ObjectMapperBuilderCustomizer customizer() {
return builder -> {
// 全局配置序列化返回 JSON 处理
JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addSerializer(Long.class, BigNumberSerializer.INSTANCE);
javaTimeModule.addSerializer(Long.TYPE, BigNumberSerializer.INSTANCE);
javaTimeModule.addSerializer(BigInteger.class, BigNumberSerializer.INSTANCE);
javaTimeModule.addSerializer(BigDecimal.class, ToStringSerializer.instance);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(formatter));
javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(formatter));
builder.modules(javaTimeModule);
builder.timeZone(TimeZone.getDefault());
log.info("初始化 jackson 配置");
};
}
}
三、注解
如果配置的无法满足需求可以通过注解的方式解决
java
/**
* 搜索值
*/
@JsonIgnore // 不进行序列化与反序列化处理
@TableField(exist = false)
private String searchValue;
java
/**
* 请求参数
*/
@JsonInclude(JsonInclude.Include.NON_EMPTY) // 只要非空的时候进行序列化与反序列化处理
@TableField(exist = false)
private Map<String, Object> params = new HashMap<>();
java
@JsonIgnore
@JsonProperty // 指定别名
public String getPassword() {
return password;
}
java
@JsonFormat(pattern = "yyyy-MM-dd") // 指定日期序列化与反序列化格式格式
四、json工具类
1. 工具内容
位于package com.ruoyi.common.utils;包下
java
/**
* JSON 工具类
*
* @author 芋道源码
*/
// 生成一个私有的无参构造函数
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class JsonUtils {
// 创建OBJECT_MAPPER实例对象
private static final ObjectMapper OBJECT_MAPPER = SpringUtils.getBean(ObjectMapper.class);
// 获取OBJECT_MAPPER实例对象
public static ObjectMapper getObjectMapper() {
return OBJECT_MAPPER;
}
// 将对象转换为字符串
public static String toJsonString(Object object) {
if (ObjectUtil.isNull(object)) {
return null;
}
try {
return OBJECT_MAPPER.writeValueAsString(object);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
// 将字符串转换为对象
public static <T> T parseObject(String text, Class<T> clazz) {
if (StringUtils.isEmpty(text)) {
return null;
}
try {
return OBJECT_MAPPER.readValue(text, clazz);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
// 将字节数组转换为对象
public static <T> T parseObject(byte[] bytes, Class<T> clazz) {
if (ArrayUtil.isEmpty(bytes)) {
return null;
}
try {
return OBJECT_MAPPER.readValue(bytes, clazz);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
// 将字符串转换为对象(使用TypeReference)
public static <T> T parseObject(String text, TypeReference<T> typeReference) {
if (StringUtils.isBlank(text)) {
return null;
}
try {
return OBJECT_MAPPER.readValue(text, typeReference);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
// 将字符串转换为字典使用比hashmap更简单
public static Dict parseMap(String text) {
if (StringUtils.isBlank(text)) {
return null;
}
try {
return OBJECT_MAPPER.readValue(text, OBJECT_MAPPER.getTypeFactory().constructType(Dict.class));
} catch (MismatchedInputException e) {
// 类型不匹配说明不是json
return null;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
// 将字符串转换为字典列表
public static List<Dict> parseArrayMap(String text) {
if (StringUtils.isBlank(text)) {
return null;
}
try {
return OBJECT_MAPPER.readValue(text, OBJECT_MAPPER.getTypeFactory().constructCollectionType(List.class, Dict.class));
} catch (IOException e) {
throw new RuntimeException(e);
}
}
// 将字符串转换为对象列表
public static <T> List<T> parseArray(String text, Class<T> clazz) {
if (StringUtils.isEmpty(text)) {
return new ArrayList<>();
}
try {
return OBJECT_MAPPER.readValue(text, OBJECT_MAPPER.getTypeFactory().constructCollectionType(List.class, clazz));
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
2. 使用工具
测试getObjectMapper方法
java
@RestController
@RequestMapping("/demo/test")
@SaIgnore // 忽略校验
public class TestController {
@GetMapping("JsonUtils")
public void testGetObjectMapper(){
// 获取objectMapper
ObjectMapper objectMapper = JsonUtils.getObjectMapper();
// 打印
Console.log("objectMapper,{}",objectMapper);
}
}
测试toJsonString方法,将对象转换为字符串
java
@GetMapping("JsonUtils")
public void testGetObjectMapper(){
// 创建对象
User user = new User("张三" , 18);
// 序列化
String str = JsonUtils.toJsonString(user);
Console.log(str);
}
测试parseObject方法,将字符串转换对象
java
@GetMapping("JsonUtils")
public void testGetObjectMapper(){
// 创建json
String json="{\"name\":\"张三\",\"age\":18}";
// 反序列化
User user = JsonUtils.parseObject(json, User.class);
Console.log(user);
}
测试parseObject方法,将字节数组转换对象
java
@GetMapping("JsonUtils")
public void testGetObjectMapper(){
// 创建json
String json="{\"name\":\"张三\",\"age\":18}";
// 反序列化
User user = JsonUtils.parseObject(StrUtil.utf8Bytes(json), User.class);
Console.log(user);
}
测试parseObject方法,将字符串转换为复杂类型
java
@GetMapping("JsonUtils")
public void testGetObjectMapper(){
// 创建json
String json="[{\"name\":\"张三\",\"age\":18}]";
// 反序列化
List<User> users = JsonUtils.parseObject(json, new TypeReference<List<User>>() {
});
Console.log(users);
}
测试parseMap方法,将字符串转换字典,Dict继承了LinkedHashMap对其做了进一步增强
java
@GetMapping("JsonUtils")
public void testGetObjectMapper(){
// 创建json
String json="{\"name\":\"张三\",\"age\":18}";
// 反序列化
Dict dict = JsonUtils.parseMap(json);
if (dict != null) {
Console.log(dict.get("name"));
}
}
测试parseArrayMap方法,将字符串转换字典列表,Dict继承了LinkedHashMap对其做了进一步增强
java
@GetMapping("JsonUtils")
public void testGetObjectMapper(){
// 创建json
String json="[{\"name\":\"张三\",\"age\":18}]";
// 反序列化
List<Dict> dictList = JsonUtils.parseArrayMap(json);
if (CollectionUtil.isNotEmpty(dictList)) {
for (Dict dict : dictList) {
Console.log("name: {}, age: {}", dict.getStr("name"), dict.getInt("age"));
}
}
}
测试parseArrayMap方法,将字符串转换字典列表
java
@GetMapping("JsonUtils")
public void testGetObjectMapper(){
// 创建json
String json="[{\"name\":\"张三\",\"age\":18}]";
// 反序列化
List<User> userList = JsonUtils.parseArray(json, User.class);
if (CollectionUtil.isNotEmpty(userList)) {
for (User user : userList) {
Console.log("name: {}, age: {}", user.getName(), user.getAge());
}
}
}