|
|
|
@ -15,35 +15,46 @@ import java.text.SimpleDateFormat;
|
|
|
|
|
/**
|
|
|
|
|
* jackson的序列化和反序列化
|
|
|
|
|
*/
|
|
|
|
|
// 使用lombok的@Slf4j注解,用于自动生成日志相关的代码,方便在类中记录各种操作相关的日志信息,便于后续查看操作情况以及进行问题排查,比如在序列化或反序列化出现错误时记录详细的错误信息。
|
|
|
|
|
@Slf4j
|
|
|
|
|
public class JsonUtil {
|
|
|
|
|
// 创建一个ObjectMapper对象,ObjectMapper是Jackson库中用于处理JSON序列化和反序列化的核心类,通过它可以将Java对象转换为JSON字符串,也可以将JSON字符串转换为Java对象,这里创建一个实例用于后续的相关操作。
|
|
|
|
|
private static ObjectMapper objectMapper = new ObjectMapper();
|
|
|
|
|
|
|
|
|
|
// 静态代码块,在类加载时执行,用于对ObjectMapper对象进行一系列的配置,以满足特定的JSON处理需求。
|
|
|
|
|
static {
|
|
|
|
|
// 设置序列化时包含所有字段,即不管字段是否为null,都会将其列入进行JSON转换,这样可以保证完整的对象结构信息能在JSON中体现,与之对应的还有其他包含策略,例如只包含非null字段等,这里选择了总是包含所有字段的策略。
|
|
|
|
|
//所有字段都列入进行转换
|
|
|
|
|
objectMapper.setSerializationInclusion(JsonSerialize.Inclusion.ALWAYS);
|
|
|
|
|
// 取消默认将日期类型转换为时间戳形式的行为,通常在JSON序列化时,日期对象可能会被默认转换为时间戳(从1970年1月1日00:00:00 UTC到该日期的毫秒数),这里配置为false,表示按照其他自定义的日期格式进行转换,方便在JSON中呈现更直观的日期格式。
|
|
|
|
|
//取消默认转换timestamp形式
|
|
|
|
|
objectMapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS,false);
|
|
|
|
|
// 配置忽略空bean(即没有属性值的Java对象)转换为JSON时出现的错误,在某些情况下,如果尝试将一个没有任何属性值的空对象转换为JSON,可能会抛出异常,这里设置为false后,遇到这种情况就不会抛出异常,而是返回一个合适的表示(比如空对象对应的JSON表示),增强了程序的健壮性。
|
|
|
|
|
//忽略空bean转json的错误
|
|
|
|
|
objectMapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS,false);
|
|
|
|
|
// 统一设置日期的格式,通过传入一个SimpleDateFormat对象,指定了日期格式为DateTimeUtil类中定义的标准格式("yyyy-MM-dd HH:mm:ss"),这样在序列化和反序列化涉及日期类型时,都会按照这个统一格式进行处理,便于前后端在日期格式上保持一致,避免因格式不一致导致的解析错误等问题。
|
|
|
|
|
//统一时间的格式
|
|
|
|
|
objectMapper.setDateFormat(new SimpleDateFormat(DateTimeUtil.STANDARD_FORMAT));
|
|
|
|
|
// 配置忽略JSON中存在属性,但对应的Java对象不存在该属性时的错误,在反序列化JSON字符串为Java对象时,如果JSON中有一些Java对象中未定义的额外属性,默认情况下可能会抛出异常,这里设置为false后,就会忽略这些未知属性,只对Java对象中定义的属性进行赋值,提高了对不同JSON结构的兼容性。
|
|
|
|
|
//忽略json存在属性,但是java对象不存在属性的错误
|
|
|
|
|
objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES,false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 序列化方法,将对象转为字符串
|
|
|
|
|
* @param obj
|
|
|
|
|
* @param <T>
|
|
|
|
|
* @return
|
|
|
|
|
* 这是一个序列化方法,用于将Java对象转换为JSON字符串格式。
|
|
|
|
|
* 如果传入的对象为null,则直接返回null。
|
|
|
|
|
* 如果对象不为null,先判断对象是否本身就是字符串类型,如果是则直接返回该字符串(因为已经是符合要求的格式了),否则使用ObjectMapper对象的writeValueAsString方法将对象转换为JSON字符串并返回,如果在转换过程中出现IOException异常(比如对象的某些属性无法正确序列化等情况),则记录警告日志,并返回null表示转换失败。
|
|
|
|
|
*
|
|
|
|
|
* @param obj 要转换为JSON字符串的Java对象,其类型可以是任意Java对象,只要该对象及其包含的属性都能被ObjectMapper正确序列化。
|
|
|
|
|
* @param <T> 泛型参数,用于表示传入对象的类型,在方法返回值中也保持一致的类型,方便处理各种不同类型的对象序列化。
|
|
|
|
|
* @return 转换后的JSON字符串,如果传入对象为null或者序列化过程出现异常则返回null。
|
|
|
|
|
*/
|
|
|
|
|
public static <T> String obj2String(T obj){
|
|
|
|
|
if(obj == null){
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
try {
|
|
|
|
|
return obj instanceof String ? (String) obj : objectMapper.writeValueAsString(obj);
|
|
|
|
|
return obj instanceof String? (String) obj : objectMapper.writeValueAsString(obj);
|
|
|
|
|
} catch (IOException e) {
|
|
|
|
|
log.warn("parse object to string error",e);
|
|
|
|
|
return null;
|
|
|
|
@ -51,17 +62,20 @@ public class JsonUtil {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 序列化方法,同上,只是输出的格式是美化的,便于测试
|
|
|
|
|
* @param obj
|
|
|
|
|
* @param <T>
|
|
|
|
|
* @return
|
|
|
|
|
* 这也是一个序列化方法,功能和obj2String方法类似,都是将Java对象转换为JSON字符串,但这个方法输出的JSON字符串格式是经过美化的,更便于查看和测试,通常在开发调试阶段使用,能更清晰地看到JSON结构和数据内容。
|
|
|
|
|
* 如果传入的对象为null,则直接返回null。
|
|
|
|
|
* 如果对象不为null,先判断对象是否本身就是字符串类型,如果是则直接返回该字符串,否则使用ObjectMapper对象的writerWithDefaultPrettyPrinter方法获取一个能输出美化格式的写入器,再通过它将对象转换为JSON字符串并返回,如果在转换过程中出现IOException异常,则记录警告日志,并返回null表示转换失败。
|
|
|
|
|
*
|
|
|
|
|
* @param obj 要转换为JSON字符串的Java对象,其类型可以是任意Java对象,只要该对象及其包含的属性都能被ObjectMapper正确序列化。
|
|
|
|
|
* @param <T> 泛型参数,用于表示传入对象的类型,在方法返回值中也保持一致的类型,方便处理各种不同类型的对象序列化。
|
|
|
|
|
* @return 转换后的JSON字符串,如果传入对象为null或者序列化过程出现异常则返回null,正常情况下返回美化格式的JSON字符串,方便查看和测试。
|
|
|
|
|
*/
|
|
|
|
|
public static <T> String obj2StringPretty(T obj){
|
|
|
|
|
if(obj == null){
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
try {
|
|
|
|
|
return obj instanceof String ? (String) obj : objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj);
|
|
|
|
|
return obj instanceof String? (String) obj : objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj);
|
|
|
|
|
} catch (IOException e) {
|
|
|
|
|
log.warn("parse object to string error",e);
|
|
|
|
|
return null;
|
|
|
|
@ -69,11 +83,14 @@ public class JsonUtil {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 比较简单的反序列化的方法,将字符串转为单个对象
|
|
|
|
|
* @param str
|
|
|
|
|
* @param clazz
|
|
|
|
|
* @param <T>
|
|
|
|
|
* @return
|
|
|
|
|
* 这是一个相对简单的反序列化方法,用于将JSON字符串转换为单个Java对象。
|
|
|
|
|
* 如果传入的字符串为空(StringUtils.isEmpty判断,可能是自定义的工具方法判断字符串是否为空,包括null和空字符串情况)或者传入的目标Java类对象(clazz)为null,则直接返回null。
|
|
|
|
|
* 如果字符串和目标类都不为空,先判断目标类是否就是String类型,如果是则直接将传入的字符串强制转换为对应类型(T)并返回(因为本身就是字符串,无需进行反序列化操作了),否则使用ObjectMapper对象的readValue方法,按照指定的目标类(clazz)将JSON字符串反序列化并返回对应的Java对象,如果在反序列化过程中出现IOException异常(比如JSON格式不符合目标类结构等情况),则记录警告日志,并返回null表示反序列化失败。
|
|
|
|
|
*
|
|
|
|
|
* @param str 要反序列化的JSON字符串,需要符合对应Java对象的结构和数据类型要求,否则可能导致反序列化失败。
|
|
|
|
|
* @param clazz 目标Java类对象,用于指定反序列化后生成的对象类型,ObjectMapper会根据这个类型信息来解析JSON字符串并创建相应的Java对象。
|
|
|
|
|
* @param <T> 泛型参数,用于表示目标Java类的类型,在方法返回值中也返回该类型的对象,方便处理各种不同类型的反序列化需求。
|
|
|
|
|
* @return 反序列化后的Java对象,如果传入的字符串为空、目标类为null或者反序列化过程出现异常则返回null。
|
|
|
|
|
*/
|
|
|
|
|
public static <T> T String2Obj(String str,Class<T> clazz){
|
|
|
|
|
if(StringUtils.isEmpty(str) || clazz == null){
|
|
|
|
@ -88,11 +105,14 @@ public class JsonUtil {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 复杂对象的反序列化(通用)
|
|
|
|
|
* @param str
|
|
|
|
|
* @param typeReference
|
|
|
|
|
* @param <T>
|
|
|
|
|
* @return
|
|
|
|
|
* 这是一个复杂对象的反序列化通用方法,用于处理一些较为复杂的类型结构的反序列化情况,比如包含泛型的类型等,通过传入TypeReference类型的参数来指定具体的复杂类型结构信息。
|
|
|
|
|
* 如果传入的字符串为空或者传入的TypeReference对象为null,则直接返回null。
|
|
|
|
|
* 如果都不为空,先判断TypeReference所表示的类型是否就是String类型,如果是则直接返回传入的字符串(因为无需进行反序列化操作了),否则使用ObjectMapper对象的readValue方法,按照TypeReference指定的复杂类型结构将JSON字符串反序列化并返回对应的Java对象,如果在反序列化过程中出现IOException异常,则记录警告日志,并返回null表示反序列化失败。
|
|
|
|
|
*
|
|
|
|
|
* @param str 要反序列化的JSON字符串,需要符合对应复杂类型结构的要求,否则可能导致反序列化失败。
|
|
|
|
|
* @param typeReference TypeReference类型的参数,用于详细指定复杂的Java对象类型结构信息,例如包含泛型的集合类型等,ObjectMapper会依据这个信息来准确解析JSON字符串并生成相应的Java对象。
|
|
|
|
|
* @param <T> 泛型参数,用于表示复杂类型的最终对象类型,在方法返回值中也返回该类型的对象,方便处理各种复杂类型的反序列化需求。
|
|
|
|
|
* @return 反序列化后的Java对象,如果传入的字符串为空、TypeReference为null或者反序列化过程出现异常则返回null。
|
|
|
|
|
*/
|
|
|
|
|
public static <T> T Str2Obj(String str, TypeReference typeReference){
|
|
|
|
|
if(StringUtils.isEmpty(str) || typeReference == null){
|
|
|
|
@ -107,12 +127,15 @@ public class JsonUtil {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 第二种方式实现复杂对象的反序列化
|
|
|
|
|
* @param str
|
|
|
|
|
* @param collectionClass
|
|
|
|
|
* @param elementClasses
|
|
|
|
|
* @param <T>
|
|
|
|
|
* @return
|
|
|
|
|
* 这是第二种方式实现复杂对象的反序列化方法,主要用于处理一些集合类型以及其元素类型明确的复杂对象反序列化情况,通过传入集合类以及元素类等信息来构建具体的Java类型结构,然后进行反序列化操作。
|
|
|
|
|
* 首先使用ObjectMapper的getTypeFactory方法获取类型工厂对象,再通过该工厂对象的constructParametricType方法,传入集合类(collectionClass)以及元素类(elementClasses)信息构建出具体的JavaType对象,这个对象表示了要反序列化的复杂类型结构。
|
|
|
|
|
* 然后使用ObjectMapper对象的readValue方法,按照构建好的JavaType类型结构将JSON字符串反序列化并返回对应的Java对象,如果在反序列化过程中出现IOException异常,则记录警告日志,并返回null表示反序列化失败。
|
|
|
|
|
*
|
|
|
|
|
* @param str 要反序列化的JSON字符串,需要符合通过传入的集合类和元素类构建的复杂类型结构要求,否则可能导致反序列化失败。
|
|
|
|
|
* @param collectionClass 表示集合类型的Java类对象,例如List.class、Set.class等,用于指定反序列化后的对象是哪种集合类型。
|
|
|
|
|
* @param elementClasses 可变参数,表示集合中元素的Java类对象,可以传入多个,用于指定集合中元素的具体类型,例如在List<String>中,elementClasses就是String.class,通过这些信息构建出完整的复杂类型结构用于反序列化。
|
|
|
|
|
* @param <T> 泛型参数,用于表示最终反序列化后的复杂对象类型,在方法返回值中也返回该类型的对象,方便处理各种复杂类型的反序列化需求。
|
|
|
|
|
* @return 反序列化后的Java对象,如果在反序列化过程中出现异常则返回null。
|
|
|
|
|
*/
|
|
|
|
|
public static <T> T Str2Obj(String str,Class<?> collectionClass,Class<?>... elementClasses){
|
|
|
|
|
JavaType javaType = objectMapper.getTypeFactory().constructParametricType(collectionClass,elementClasses);
|
|
|
|
@ -123,4 +146,4 @@ public class JsonUtil {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|