src/main/java/org/starrier/common/utils/json/JacksonUtils.java
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); }}