1.为什么不用fastjson
fastjson很好用,但是在做项目的时候,遇到@JsonProperty和fastjson冲突的问题,因而在此记录一个JSON工具类。
2.JSON工具类
常见的方法:
2.1 JSON字符串转换List: stringToList(String jsonString, Class clazz)
public static <T> List<T> stringToList(String jsonString, Class<T> clazz) {
ObjectMapper mapper = new ObjectMapper();
List<T> data;
//Class <T> entityClass = (Class <T>) ((ParameterizedType) JsonUtils.class.getGenericSuperclass()).getActualTypeArguments()[0];
try {
data = mapper.readValue(jsonString, getCollectionType(mapper, List.class, clazz));
return data;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
2.2 Bean中字段包含List: stringToObject(String jsonString, TypeReference valueTypeRef)
public static <T> T stringToObject(String jsonString, TypeReference<T> valueTypeRef) {
try {
objectMapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT,true);
return objectMapper.readValue(jsonString, valueTypeRef);
} catch (JsonProcessingException e) {
logger.error("JSON String转换对象失败", e);
}
return null;
}
完整方法代码:
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.reflect.ParameterizedType;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author :doyle
* @date : 2021/4/24 16:02
*/
public class JsonUtils {
public static final Logger logger = LoggerFactory.getLogger(JsonUtils.class);
public static final ObjectMapper objectMapper = new ObjectMapper();
public static String objectToJsonString(Object object) {
try {
return objectMapper.writeValueAsString(object);
} catch (JsonProcessingException e) {
logger.error("对象转换JSON String失败", e);
}
return "";
}
public static <T> T stringToObject(String jsonString, Class<T> clazz) {
try {
return objectMapper.readValue(jsonString, clazz);
} catch (JsonProcessingException e) {
logger.error("JSON String转换对象失败", e);
}
return null;
}
/**
* 此方法适用于类的属性包含List
* @param jsonString
* @param valueTypeRef
* @param <T>
* @return
*/
public static <T> T stringToObject(String jsonString, TypeReference<T> valueTypeRef) {
try {
objectMapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT,true);
return objectMapper.readValue(jsonString, valueTypeRef);
} catch (JsonProcessingException e) {
logger.error("JSON String转换对象失败", e);
}
return null;
}
public static Map<String, Object> objectToMap(Object object) {
try {
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
return objectMapper.readValue(objectToJsonString(object), Map.class);
} catch (JsonProcessingException e) {
logger.error("对象转换JSON String失败", e);
}
return new HashMap<>();
}
public static <T> T objectToExample(Object object, Class<T> clazz) {
return stringToObject(objectToJsonString(objectToMap(object)), clazz);
}
//
public static <T> List<T> stringToList(String jsonString, Class<T> clazz) {
ObjectMapper mapper = new ObjectMapper();
List<T> data;
//Class <T> entityClass = (Class <T>) ((ParameterizedType) JsonUtils.class.getGenericSuperclass()).getActualTypeArguments()[0];
try {
data = mapper.readValue(jsonString, getCollectionType(mapper, List.class, clazz));
return data;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static JavaType getCollectionType(ObjectMapper mapper, Class<?> collectionClass, Class<?>... elementClasses) {
return mapper.getTypeFactory().constructParametricType(collectionClass, elementClasses);
}
}