Starrier/commons

View on GitHub
src/main/java/org/starrier/common/utils/json/JacksonUtils.java

Summary

Maintainability
A
3 hrs
Test Coverage
package org.starrier.common.utils.json;
 
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.StringUtils;
import parquet.org.slf4j.Logger;
import parquet.org.slf4j.LoggerFactory;
import reactor.core.publisher.Mono;
 
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Supplier;
 
/**
* @author starrier
* @date 2021/1/11
*/
`JacksonUtils` has 22 methods (exceeds 20 allowed). Consider refactoring.
public class JacksonUtils {
 
private static final Logger LOGGER = LoggerFactory.getLogger(JacksonUtils.class);
 
/**
* 加载速度太慢了,放在静态代码块中
*
* <blockquote><pre>
* private static final ObjectMapper mapper = new ObjectMapper();
* </pre></blockquote>
*/
private static final ObjectMapper mapper;
 
/**
* 设置一些通用的属性
*
* <blockquote><pre>
*
* </pre></blockquote>
* <p>
*/
static {
mapper = new ObjectMapper();
// 如果json中有新增的字段并且是实体类类中不存在的,不报错
// mapper.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, false);
// 如果存在未知属性,则忽略不报错
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// 允许key没有双引号
mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
// 允许key有单引号
mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
// 允许整数以0开头
mapper.configure(JsonParser.Feature.ALLOW_NUMERIC_LEADING_ZEROS, true);
// 允许字符串中存在回车换行控制符
mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
}
 
public static String toJSONString(Object obj) {
return obj != null ? toJSONString(obj, () -> "", false) : "";
}
 
public static String toFormatJSONString(Object obj) {
return obj != null ? toJSONString(obj, () -> "", true) : "";
}
 
public static String toJSONString(Object obj, Supplier<String> defaultSupplier, boolean format) {
try {
if (obj == null) {
return defaultSupplier.get();
}
if (obj instanceof String) {
return obj.toString();
}
if (obj instanceof Number) {
return obj.toString();
}
if (format) {
return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj);
}
Avoid too many `return` statements within this method.
return mapper.writeValueAsString(obj);
} catch (Throwable e) {
LOGGER.error(String.format("toJSONString %s", obj != null ? obj.toString() : "null"), e);
}
Avoid too many `return` statements within this method.
return defaultSupplier.get();
}
 
public static <T> T toJavaObject(String value, Class<T> tClass) {
return StringUtils.isNotBlank(value) ? toJavaObject(value, tClass, () -> null) : null;
}
 
public static <T> T toJavaObject(Object obj, Class<T> tClass) {
return obj != null ? toJavaObject(toJSONString(obj), tClass, () -> null) : null;
}
 
public static <T> Mono<T> toReactiveJavaObject(Object obj, Class<T> tClass) {
return obj != null ? toReactiveJavaObject(toJSONString(obj), tClass, () -> null) : null;
}
 
public static <T> T toJavaObject(String value, Class<T> tClass, Supplier<T> defaultSupplier) {
try {
if (StringUtils.isBlank(value)) {
return defaultSupplier.get();
}
return mapper.readValue(value, tClass);
} catch (Throwable e) {
LOGGER.error(String.format("toJavaObject exception: \n %s\n %s", value, tClass), e);
}
return defaultSupplier.get();
}
 
public static <T> Mono<T> toReactiveJavaObject(String value, Class<T> tClass, Supplier<T> defaultSupplier) {
try {
if (StringUtils.isBlank(value)) {
return Mono.just(defaultSupplier.get());
}
return Mono.just(mapper.readValue(value, tClass));
} catch (Throwable e) {
LOGGER.error(String.format("toJavaObject exception: \n %s\n %s", value, tClass), e);
}
return Mono.just(defaultSupplier.get());
}
 
public static <T> List<T> toJavaObjectList(String value, Class<T> tClass) {
return StringUtils.isNotBlank(value) ? toJavaObjectList(value, tClass, () -> null) : null;
}
 
public static <T> List<T> toJavaObjectList(Object obj, Class<T> tClass) {
return obj != null ? toJavaObjectList(toJSONString(obj), tClass, () -> null) : null;
}
 
public static <T> List<T> toJavaObjectList(String value, Class<T> tClass, Supplier<List<T>> defaultSupplier) {
try {
if (StringUtils.isBlank(value)) {
return defaultSupplier.get();
}
JavaType javaType = mapper.getTypeFactory().constructParametricType(List.class, tClass);
return mapper.readValue(value, javaType);
} catch (Throwable e) {
LOGGER.error(String.format("toJavaObjectList exception \n%s\n%s", value, tClass), e);
}
return defaultSupplier.get();
}
 
// 简单地直接用json复制或者转换(Cloneable)
public static <T> T jsonCopy(Object obj, Class<T> tClass) {
return obj != null ? toJavaObject(toJSONString(obj), tClass) : null;
}
 
public static Map<String, Object> toMap(String value) {
return StringUtils.isNotBlank(value) ? toMap(value, () -> null) : null;
}
 
public static Map<String, Object> toMap(Object value) {
return value != null ? toMap(value, () -> null) : null;
}
 
public static Map<String, Object> toMap(Object value, Supplier<Map<String, Object>> defaultSupplier) {
if (value == null) {
return defaultSupplier.get();
}
try {
if (value instanceof Map) {
return (Map<String, Object>) value;
}
} catch (Exception e) {
LOGGER.info("fail to convert" + toJSONString(value), e);
}
return toMap(toJSONString(value), defaultSupplier);
}
 
public static Map<String, Object> toMap(String value, Supplier<Map<String, Object>> defaultSupplier) {
if (StringUtils.isBlank(value)) {
return defaultSupplier.get();
}
try {
return toJavaObject(value, LinkedHashMap.class);
} catch (Exception e) {
LOGGER.error(String.format("toMap exception\n%s", value), e);
}
return defaultSupplier.get();
}
 
 
public static List<Object> toList(String value) {
return StringUtils.isNotBlank(value) ? toList(value, () -> null) : null;
}
 
public static List<Object> toList(Object value) {
return value != null ? toList(value, () -> null) : null;
}
 
public static List<Object> toList(String value, Supplier<List<Object>> defaultSuppler) {
if (StringUtils.isBlank(value)) {
return defaultSuppler.get();
}
try {
return toJavaObject(value, List.class);
} catch (Exception e) {
LOGGER.error("toList exception\n" + value, e);
}
return defaultSuppler.get();
}
 
public static List<Object> toList(Object value, Supplier<List<Object>> defaultSuppler) {
if (value == null) {
return defaultSuppler.get();
}
if (value instanceof List) {
return (List<Object>) value;
}
return toList(toJSONString(value), defaultSuppler);
}
 
public static long getLong(Map<String, Object> map, String key) {
if (MapUtils.isEmpty(map)) {
return 0L;
}
String valueStr = String.valueOf(map.get(key));
if (StringUtils.isBlank(valueStr) || !StringUtils.isNumeric(valueStr)) {
return 0L;
}
return Long.valueOf(valueStr);
}
 
public static int getInt(Map<String, Object> map, String key) {
if (MapUtils.isEmpty(map)) {
return 0;
}
String valueStr = String.valueOf(map.get(key));
if (StringUtils.isBlank(valueStr) || !StringUtils.isNumeric(valueStr)) {
return 0;
}
return Integer.valueOf(valueStr);
}
}