项目中经常需要对象转成json字符串,json串转对象,一般经常用fastjson,gson,以及springboot默认支持的jackson,由于fastjson爆出漏洞太频繁,新项目一般建议用gson或jackson,也可以用protostuff来做,protostuff的性能比较好,具体benchmark可以参考https://github.com/eishay/jvm-serializers/wiki,如果想提供多种工具类可以定义统一的接口采用SPI的机制,通过SPI可以对外提供多种选择,需要特别注意的是定义对象里有Long类型,反序列化后可能变成Integer类型,这个巨坑,还有就是jackson反序列化,泛型处理要用TypeReference解决,关于序列化的漏洞可参考文章https://mp.weixin.qq.com/s/3BQFpkA4IGheXvxC_qjh3g
下面是简单封装的类如下
public class JsonUtil {
private static final ObjectMapper om = new ObjectMapper();
private static final String JSON_CHARSET = "UTF-8";
public static final Charset CHARSET = Charset.forName(JSON_CHARSET);
static{
om.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
}
private JsonUtil() {
}
public static String toJSONIngoreException(Object obj) {
try{
if ( obj == null ) {
return null;
}
return new String(om.writeValueAsBytes(obj), JSON_CHARSET);
}catch (Exception e){
}
return null;
}
public static String toJSON(Object obj) throws Exception {
if ( obj == null ) {
return null;
}
return new String(om.writeValueAsBytes(obj), JSON_CHARSET);
}
public static byte[] toJSONAsBytes(Object obj) throws Exception {
if ( obj == null ) {
return null;
}
return toJSON(obj).getBytes(JsonUtil.CHARSET);
}
public static <T> T fromJson(byte[] data, Class<T> javaType) throws Exception {
if ( data == null ) {
return null;
}
return fromJson(new String(data, JsonUtil.CHARSET), javaType);
}
public static <T> T fromJson(String jsonAsString, Class<T> valueType) {
if(StringUtils.isBlank(jsonAsString)) {
return null;
}
try {
return (T) om.readValue(jsonAsString, valueType);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static <T> T fromJson(String jsonAsString, JavaType javaType) {
if(StringUtils.isBlank(jsonAsString)) {
return null;
}
try {
return (T) om.readValue(jsonAsString, javaType);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static void main(String[] args) {
}
}