JSON工具类,解决JSON字符串转换List和Bean中字段包含List

367 阅读1分钟

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);
    }
}