Index: forgon-tools/src/main/java/com/forgon/tools/json/JacksonUtil.java =================================================================== diff -u --- forgon-tools/src/main/java/com/forgon/tools/json/JacksonUtil.java (revision 0) +++ forgon-tools/src/main/java/com/forgon/tools/json/JacksonUtil.java (revision 41336) @@ -0,0 +1,76 @@ +package com.forgon.tools.json; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import net.sf.json.JSONObject; +import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; + +public class JacksonUtil { + /** + * 将对象转换为JSON字符串。这里将可能的Json处理异常转换成了运行时异常。避免使用的地方必须捕获异常。 + * @param object 需要转换的对象 + * @return JSON字符串 + */ + public static String trans2JsonStr(Object object) { + ObjectMapper objectMapper = objectMapper(); + try { + return objectMapper.writeValueAsString(object); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + + /** + * Json字符串转换为对象 + * @param jsonStr Json字符串 + * @param clazz 目标对象类型 + * @return 目标对象 + * @param 目标对象类型 + */ + public static T parseObject(String jsonStr, Class clazz) { + ObjectMapper objectMapper = objectMapper(); + try { + return objectMapper.readValue(jsonStr, clazz); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** + * Json字符串转换为对象 + * @param jsonStr Json字符串 + * @param valueTypeRef 泛型对象类型 + * @param 泛型对象类型 + * @return 泛型对象 + */ + public static T parseObject(String jsonStr, TypeReference valueTypeRef) { + ObjectMapper objectMapper = objectMapper(); + try { + return objectMapper.readValue(jsonStr, valueTypeRef); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** + * 给测试使用的,有些单元测试场景,为了保持与原来的结果一致,就会转换为JSONObject以满足重构前的结果判断。也为了有些地方为了兼容,临时转换使用。最好不要使用这个方法 + * @param object 需要转换的对象 + * @return JSONObject对象 + */ + public static JSONObject trans2JSONObject(Object object) { + return JSONObject.fromObject(trans2JsonStr(object)); + } + + /** + * 获取ObjectMapper对象。这里每次都创建实例对象。可以考虑使用对象池。如果使用单例的话,也可能会有并发线程争用影响性能 + * @return ObjectMapper对象 + */ + public static ObjectMapper objectMapper() { + Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.json(); + ObjectMapper objectMapper = builder.build(); + objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + return objectMapper; + } +}