个人理解
:JacksonUtils
类提供了一种简便的方式来处理 JSON 数据的序列化和反序列化,同时提供了异常处理,使得在遇到错误时能够给出清晰的反馈。这样的工具类可以在任何需要处理 JSON 的 Java 应用程序中被重用。
writeValueAsString(Object value)
: 这个方法接受一个 Java 对象作为参数,并将其序列化为 JSON 格式的字符串。如果序列化过程中发生错误,例如对象包含无法序列化的属性,方法将捕获 JsonProcessingException 异常,打印异常堆栈信息,并返回一个空字符串。
readValue(String content, Class<T> valueType)
: 这个方法接受一个 JSON 字符串和一个目标类类型作为参数,将 JSON 字符串反序列化为指定类型的 Java 对象。如果反序列化过程中发生错误,例如 JSON 格式不正确或无法映射到目标类,方法将捕获 IOException 异常,打印异常堆栈信息,并返回 null。
readValue(String content, TypeReference<T> valueTypeRef)
: 这个方法与上一个方法类似,也是用于反序列化 JSON 字符串,但它接受一个 TypeReference 对象作为参数,用于处理泛型类型。这在反序列化泛型集合或映射时非常有用,因为 Java 的类型擦除会导致泛型信息丢失,TypeReference 可以帮助保留这些信息。
readValue(InputStream src, Class<T> valueType)
: 这个方法从一个 InputStream 中读取 JSON 数据,并将其反序列化为指定类型的 Java 对象。这在处理从文件或网络流中读取的 JSON 数据时很有用。
convertValue(Object fromValue, Class<T> toValueType)
: 这个方法将一个 Java 对象从一种类型转换为另一种类型。这在需要将对象转换为不同的类或接口实现时很有用。
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它基于JavaScript编程语言的一个子集,但是由于其文本格式清晰、易于解析,并且能够很好地跨平台工作,因此被广泛用于不同编程语言和系统之间的数据交换。
通俗地说,JSON就像一种简单的数据“速记”方法,它允许人们用一定的格式来书写和分享信息,而这些信息可以被不同的计算机系统快速理解和处理。JSON格式的数据由键值对组成,类似于Python中的字典或者Java中的对象,键是一个字符串,值可以是字符串、数字、数组、布尔值(true或false)、null或者其它的JSON对象。
举个例子,如果你想描述一个人的信息,包括他的名字、年龄和喜好,你可以用JSON这样写:
{
"name": "张三",
"age": 30,
"likes": ["足球", "游泳", "旅行"]
}
在这个例子中,name
、age
和likes
是键,而"张三"
、30
和["足球", "游泳", "旅行"]
是相应的值。这样的数据格式既简单又直观,而且因为它是文本格式,所以可以通过网络轻松地传输,也可以被不同的程序读取和解析。
反序列化
是指将已经序列化的数据重新转换成原始格式的过程。这个过程通常在程序需要使用数据时进行。简单来说,反序列化就是将存储在文件、数据库或者网络传输过程中的数据恢复成程序可以理解和使用的对象或数据结构。
package com.rawchen.util;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.io.InputStream;
/**
* @Description: Jackson Object Mapper 工具类
* @Date: 2020-11-07
*/
public class JacksonUtils {
// 静态的 ObjectMapper 实例,用于 JSON 的序列化和反序列化
private static ObjectMapper objectMapper = new ObjectMapper();
/**
* 将对象转换为 JSON 字符串。
*
* @param value 要转换的对象
* @return JSON 字符串,如果转换失败则返回空字符串
*/
public static String writeValueAsString(Object value) {
try {
// 序列化对象为 JSON 字符串
return objectMapper.writeValueAsString(value);
} catch (JsonProcessingException e) {
// 打印异常信息
e.printStackTrace();
// 发生异常时返回空字符串
return "";
}
}
/**
* 将 JSON 字符串转换为指定类型的对象。
*
* @param content JSON 字符串
* @param valueType 对象类型
* @param <T> 对象类型
* @return 转换后的对象,如果转换失败则返回 null
*/
public static <T> T readValue(String content, Class<T> valueType) {
try {
// 反序列化 JSON 字符串为指定类型的对象
return objectMapper.readValue(content, valueType);
} catch (IOException e) {
// 打印异常信息
e.printStackTrace();
// 发生异常时返回 null
return null;
}
}
/**
* 将 JSON 字符串转换为指定泛型类型的对象。
*
* @param content JSON 字符串
* @param valueTypeRef 泛型类型
* @param <T> 泛型类型
* @return 转换后的对象,如果转换失败则返回 null
*/
public static <T> T readValue(String content, TypeReference<T> valueTypeRef) {
try {
// 反序列化 JSON 字符串为指定泛型类型的对象
return objectMapper.readValue(content, valueTypeRef);
} catch (IOException e) {
// 打印异常信息
e.printStackTrace();
// 发生异常时返回 null
return null;
}
}
/**
* 从输入流中读取 JSON 数据并转换为指定类型的对象。
*
* @param src 包含 JSON 数据的输入流
* @param valueType 对象类型
* @param <T> 对象类型
* @return 转换后的对象,如果转换失败则返回 null
*/
public static <T> T readValue(InputStream src, Class<T> valueType) {
try {
// 从输入流中读取 JSON 数据并反序列化为指定类型的对象
return objectMapper.readValue(src, valueType);
} catch (IOException e) {
// 打印异常信息
e.printStackTrace();
// 发生异常时返回 null
return null;
}
}
/**
* 将一个对象转换为另一种类型。
*
* @param fromValue 源对象
* @param toValueType 目标类型
* @param <T> 目标类型
* @return 转换后的对象
*/
public static <T> T convertValue(Object fromValue, Class<T> toValueType) {
// 将源对象转换为另一种类型的对象
return objectMapper.convertValue(fromValue, toValueType);
}
}