package com.ltkj.tduck.utils;
|
|
import cn.hutool.core.util.StrUtil;
|
import com.fasterxml.jackson.annotation.JsonInclude;
|
import com.fasterxml.jackson.core.JsonParser;
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
import com.fasterxml.jackson.core.type.TypeReference;
|
import com.fasterxml.jackson.databind.*;
|
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
|
|
import java.io.IOException;
|
import java.util.ArrayList;
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.Map;
|
|
/**
|
* @author smalljop
|
* @description: json工具类 使用jackson
|
* @create: 2018-10-23 10:21
|
**/
|
public class JsonUtils {
|
|
private final static ObjectMapper objectMapper = new ObjectMapper();
|
|
static {
|
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
|
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
|
objectMapper.registerModule(new JavaTimeModule());
|
}
|
|
private JsonUtils() {
|
|
}
|
|
|
/**
|
* 获取objectMapper实例
|
*/
|
public static ObjectMapper getInstance() {
|
return objectMapper;
|
}
|
|
/**
|
* javaBean、列表数组转换为json字符串
|
*/
|
public static String objToJson(Object obj) {
|
try {
|
return objectMapper.writeValueAsString(obj);
|
} catch (JsonProcessingException e) {
|
e.printStackTrace();
|
}
|
return null;
|
}
|
|
/**
|
* javaBean、列表数组转换为json字符串,忽略空值
|
*/
|
public static String objToJsonIgnoreNull(Object obj) throws Exception {
|
ObjectMapper mapper = new ObjectMapper();
|
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
|
return mapper.writeValueAsString(obj);
|
}
|
|
/**
|
* json 转对象
|
*/
|
public static <T> T jsonToObj(String jsonString, Class<T> clazz) {
|
if (StrUtil.isBlank(jsonString)) {
|
return null;
|
}
|
//允许出现单引号
|
objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
|
//接受只有一个元素的数组的反序列化
|
objectMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
|
try {
|
return objectMapper.readValue(jsonString, clazz);
|
} catch (IOException e) {
|
throw new RuntimeException(e.getMessage());
|
}
|
}
|
|
/**
|
* json字符串转换为map
|
*/
|
public static <T> Map<String, Object> jsonToMap(String jsonString) {
|
if (StrUtil.isBlank(jsonString)) {
|
return null;
|
}
|
ObjectMapper mapper = new ObjectMapper();
|
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
|
try {
|
return mapper.readValue(jsonString, Map.class);
|
} catch (JsonProcessingException e) {
|
e.printStackTrace();
|
return null;
|
}
|
}
|
|
|
public static <T> JsonNode jsonToJsonNode(String jsonString) {
|
if (StrUtil.isBlank(jsonString)) {
|
return null;
|
}
|
ObjectMapper mapper = new ObjectMapper();
|
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
|
try {
|
return mapper.readValue(jsonString, JsonNode.class);
|
} catch (JsonProcessingException e) {
|
e.printStackTrace();
|
return null;
|
}
|
|
}
|
|
|
/**
|
* json字符串转换为map
|
*/
|
public static <T> Map<String, T> jsonToMap(String jsonString, Class<T> clazz) throws Exception {
|
Map<String, Map<String, Object>> map = (Map<String, Map<String, Object>>) objectMapper.readValue(jsonString, new TypeReference<Map<String, T>>() {
|
});
|
Map<String, T> result = new HashMap<String, T>();
|
for (Map.Entry<String, Map<String, Object>> entry : map.entrySet()) {
|
result.put(entry.getKey(), mapToObj(entry.getValue(), clazz));
|
}
|
return result;
|
}
|
|
/**
|
* 深度转换json成map
|
*
|
* @param json
|
* @return
|
*/
|
public static Map<String, Object> jsonToMapDeeply(String json) throws Exception {
|
return jsonToMapRecursion(json, objectMapper);
|
}
|
|
/**
|
* 把json解析成list,如果list内部的元素存在jsonString,继续解析
|
*
|
* @param json
|
* @param mapper 解析工具
|
* @return
|
* @throws Exception
|
*/
|
private static List<Object> jsonToListRecursion(String json, ObjectMapper mapper) throws Exception {
|
if (json == null) {
|
return null;
|
}
|
|
List<Object> list = mapper.readValue(json, List.class);
|
|
for (Object obj : list) {
|
if (obj != null && obj instanceof String) {
|
String str = (String) obj;
|
if (str.startsWith("[")) {
|
obj = jsonToListRecursion(str, mapper);
|
} else if (obj.toString().startsWith("{")) {
|
obj = jsonToMapRecursion(str, mapper);
|
}
|
}
|
}
|
|
return list;
|
}
|
|
/**
|
* 把json解析成map,如果map内部的value存在jsonString,继续解析
|
*
|
* @param json
|
* @param mapper
|
* @return
|
* @throws Exception
|
*/
|
private static Map<String, Object> jsonToMapRecursion(String json, ObjectMapper mapper) throws Exception {
|
if (json == null) {
|
return null;
|
}
|
|
Map<String, Object> map = mapper.readValue(json, Map.class);
|
|
for (Map.Entry<String, Object> entry : map.entrySet()) {
|
Object obj = entry.getValue();
|
if (obj != null && obj instanceof String) {
|
String str = ((String) obj);
|
|
if (str.startsWith("[")) {
|
List<?> list = jsonToListRecursion(str, mapper);
|
map.put(entry.getKey(), list);
|
} else if (str.startsWith("{")) {
|
Map<String, Object> mapRecursion = jsonToMapRecursion(str, mapper);
|
map.put(entry.getKey(), mapRecursion);
|
}
|
}
|
}
|
|
return map;
|
}
|
|
/**
|
* 与javaBean json数组字符串转换为列表
|
*/
|
public static <T> List<T> jsonToList(String jsonArrayStr, Class<T> clazz) {
|
|
JavaType javaType = getCollectionType(ArrayList.class, clazz);
|
List<T> lst = null;
|
try {
|
lst = objectMapper.readValue(jsonArrayStr, javaType);
|
} catch (JsonProcessingException e) {
|
e.printStackTrace();
|
}
|
return lst;
|
}
|
|
|
/**
|
* 获取泛型的Collection Type
|
*
|
* @param collectionClass 泛型的Collection
|
* @param elementClasses 元素类
|
* @return JavaType Java类型
|
* @since 1.0
|
*/
|
public static JavaType getCollectionType(Class<?> collectionClass, Class<?>... elementClasses) {
|
return objectMapper.getTypeFactory().constructParametricType(collectionClass, elementClasses);
|
}
|
|
|
/**
|
* map 转JavaBean
|
*/
|
public static <T> T mapToObj(Map map, Class<T> clazz) {
|
return objectMapper.convertValue(map, clazz);
|
}
|
|
/**
|
* map 转json
|
*
|
* @param map
|
* @return
|
*/
|
public static String mapToJson(Map map) {
|
try {
|
return objectMapper.writeValueAsString(map);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
return "";
|
}
|
|
/**
|
* map 转JavaBean
|
*/
|
public static <T> T objToObj(Object obj, Class<T> clazz) {
|
return objectMapper.convertValue(obj, clazz);
|
}
|
|
|
/**
|
* 是否是json格式
|
*/
|
public static boolean isJson(String json) {
|
try {
|
if(StrUtil.isBlank(json)){
|
return false;
|
}
|
objectMapper.readTree(json);
|
return true;
|
} catch (IOException e) {
|
return false;
|
}
|
}
|
|
}
|