分享一个关于jackson的Json工具类

直接贴代码:

 

import org.codehaus.jackson.map.DeserializationConfig.Feature;

import org.codehaus.jackson.map.ObjectMapper;

import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;

import org.codehaus.jackson.type.TypeReference;



import java.io.IOException;

import java.text.SimpleDateFormat;



/**

 * JSON的工具类

 *

 * <h3>Here is an example:</h3>

 *

 * <pre>

 *     // 将json通过类型转换成对象

 *     {@link JsonUtil JsonUtil}.fromJson("{\"username\":\"username\", \"password\":\"password\"}", User.class);

 * </pre>

 * <hr />

 * <pre>

 *     // 传入转换的引用类型

 *     {@link JsonUtil JsonUtil}.fromJson("[{\"username\":\"username\", \"password\":\"password\"}, {\"username\":\"username\", \"password\":\"password\"}]", new TypeReference&lt;List&lt;User&gt;&gt;);

 * </pre>

 * <hr />

 * <pre>

 *     // 将对象转换成json

 *     {@link JsonUtil JsonUtil}.toJson(user);

 * </pre>

 * <hr />

 * <pre>

 *     // 将对象转换成json, 可以设置输出属性

 *     {@link JsonUtil JsonUtil}.toJson(user, {@link Inclusion Inclusion.ALWAYS});

 * </pre>

 * <hr />

 * <pre>

 *     // 将对象转换成json, 传入配置对象

 *     {@link ObjectMapper ObjectMapper} mapper = new ObjectMapper();

 *     mapper.setSerializationInclusion({@link Inclusion Inclusion.ALWAYS});

 *     mapper.configure({@link Feature Feature.FAIL_ON_UNKNOWN_PROPERTIES}, false);

 *     mapper.configure({@link Feature Feature.FAIL_ON_NUMBERS_FOR_ENUMS}, true);

 *     mapper.setDateFormat(new {@link SimpleDateFormat SimpleDateFormat}("yyyy-MM-dd HH:mm:ss"));

 *     {@link JsonUtil JsonUtil}.toJson(user, mapper);

 * </pre>

 * <hr />

 * <pre>

 *     // 获取Mapper对象

 *     {@link JsonUtil JsonUtil}.mapper();

 * </pre>

 *

 * @see JsonUtil JsonUtil

 * @see Feature Feature

 * @see ObjectMapper ObjectMapper

 * @see Inclusion Inclusion

 * @see IOException IOException

 * @see SimpleDateFormat SimpleDateFormat

 *

 */

@SuppressWarnings("unchecked")

public final class JsonUtil {



    private static ObjectMapper MAPPER;



    static {

        MAPPER = generateMapper(Inclusion.ALWAYS);

    }



    private JsonUtil() {

    }



    /**

     * 将json通过类型转换成对象

     *

     * <pre>

     *     {@link JsonUtil JsonUtil}.fromJson("{\"username\":\"username\", \"password\":\"password\"}", User.class);

     * </pre>

     *

     * @param json json字符串

     * @param clazz 泛型类型

     * @return 返回对象

     * @throws IOException

     */

    public static <T> T fromJson(String json, Class<T> clazz) throws IOException {

        return clazz.equals(String.class) ? (T) json : MAPPER.readValue(json, clazz);

    }



    /**

     * 将json通过类型转换成对象

     *

     * <pre>

     *     {@link JsonUtil JsonUtil}.fromJson("[{\"username\":\"username\", \"password\":\"password\"}, {\"username\":\"username\", \"password\":\"password\"}]", new TypeReference&lt;List&lt;User&gt;&gt;);

     * </pre>

     *

     * @param json json字符串

     * @param typeReference 引用类型

     * @return 返回对象

     * @throws IOException

     */

    public static <T> T fromJson(String json, TypeReference<?> typeReference) throws IOException {

        return (T) (typeReference.getType().equals(String.class) ? json : MAPPER.readValue(json, typeReference));

    }



    /**

     * 将对象转换成json

     *

     * <pre>

     *     {@link JsonUtil JsonUtil}.toJson(user);

     * </pre>

     *

     * @param src 对象

     * @return 返回json字符串

     * @throws IOException

     */

    public static <T> String toJson(T src) throws IOException {

        return src instanceof String ? (String) src : MAPPER.writeValueAsString(src);

    }



    /**

     * 将对象转换成json, 可以设置输出属性

     *

     * <pre>

     *     {@link JsonUtil JsonUtil}.toJson(user, {@link Inclusion Inclusion.ALWAYS});

     * </pre>

     *

     * {@link Inclusion Inclusion 对象枚举}

     * <ul>

     *     <li>{@link Inclusion Inclusion.ALWAYS 全部列入}</li>

     *     <li>{@link Inclusion Inclusion.NON_DEFAULT 字段和对象默认值相同的时候不会列入}</li>

     *     <li>{@link Inclusion Inclusion.NON_EMPTY 字段为NULL或者""的时候不会列入}</li>

     *     <li>{@link Inclusion Inclusion.NON_NULL 字段为NULL时候不会列入}</li>

     * </ul>

     *

     * @param src 对象

     * @param inclusion 传入一个枚举值, 设置输出属性

     * @return 返回json字符串

     * @throws IOException

     */

    public static <T> String toJson(T src, Inclusion inclusion) throws IOException {

        if (src instanceof String) {

            return (String) src;

        } else {

            ObjectMapper customMapper = generateMapper(inclusion);

            return customMapper.writeValueAsString(src);

        }

    }



    /**

     * 将对象转换成json, 传入配置对象

     *

     * <pre>

     *     {@link ObjectMapper ObjectMapper} mapper = new ObjectMapper();

     *     mapper.setSerializationInclusion({@link Inclusion Inclusion.ALWAYS});

     *     mapper.configure({@link Feature Feature.FAIL_ON_UNKNOWN_PROPERTIES}, false);

     *     mapper.configure({@link Feature Feature.FAIL_ON_NUMBERS_FOR_ENUMS}, true);

     *     mapper.setDateFormat(new {@link SimpleDateFormat SimpleDateFormat}("yyyy-MM-dd HH:mm:ss"));

     *     {@link JsonUtil JsonUtil}.toJson(user, mapper);

     * </pre>

     *

     * {@link ObjectMapper ObjectMapper}

     *

     * @see ObjectMapper

     *

     * @param src 对象

     * @param mapper 配置对象

     * @return 返回json字符串

     * @throws IOException

     */

    public static <T> String toJson(T src, ObjectMapper mapper) throws IOException {

        if (null != mapper) {

            if (src instanceof String) {

                return (String) src;

            } else {

                return mapper.writeValueAsString(src);

            }

        } else {

            return null;

        }

    }



    /**

     * 返回{@link ObjectMapper ObjectMapper}对象, 用于定制性的操作

     *

     * @return {@link ObjectMapper ObjectMapper}对象

     */

    public static ObjectMapper mapper() {

        return MAPPER;

    }



    /**

     * 通过Inclusion创建ObjectMapper对象

     *

     * {@link Inclusion Inclusion 对象枚举}

     * <ul>

     *     <li>{@link Inclusion Inclusion.ALWAYS 全部列入}</li>

     *     <li>{@link Inclusion Inclusion.NON_DEFAULT 字段和对象默认值相同的时候不会列入}</li>

     *     <li>{@link Inclusion Inclusion.NON_EMPTY 字段为NULL或者""的时候不会列入}</li>

     *     <li>{@link Inclusion Inclusion.NON_NULL 字段为NULL时候不会列入}</li>

     * </ul>

     *

     * @param inclusion 传入一个枚举值, 设置输出属性

     * @return 返回ObjectMapper对象

     */

    private static ObjectMapper generateMapper(Inclusion inclusion) {



        ObjectMapper customMapper = new ObjectMapper();



        // 设置输出时包含属性的风格

        customMapper.setSerializationInclusion(inclusion);



        // 设置输入时忽略在JSON字符串中存在但Java对象实际没有的属性

        customMapper.configure(Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);



        // 禁止使用int代表Enum的order()來反序列化Enum,非常危險

        customMapper.configure(Feature.FAIL_ON_NUMBERS_FOR_ENUMS, true);



        // 所有日期格式都统一为以下样式

        customMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));



        return customMapper;

    }

}

 

你可能感兴趣的:(Jackson)