fastjson轉jackson


使用fastjson有個內存oom的問題,我們應該盡量使用jackjson,為什么呢?因為fastjson會引發一個oom,很潛在的危險,雖然jackjson的api真的非常好用,對於解析json串來說,簡直到了出神入化的地步,但是對於這些工具來說,還是請相信外國的,中國的是只要作者一離職,就沒人維護了。
 
如何使用:
其實對於jackjson有種不同的版本,jackjson1.x的
codehaus.jackson.vesion1.8.0codehaus.jackson.vesiondependency groupIdorg.codehaus.jacksongroupId artifactIdjackson-mapper-aslartifactId version${codehaus.jackson.vesion}versiondependencydependency groupIdorg.codehaus.jacksongroupId artifactIdjackson-core-aslartifactId version${codehaus.jackson.vesion}versiondependency一類是2.x的
jackson.version2.8.0jackson.versiondependency groupIdcom.fasterxml.jackson.coregroupId artifactIdjackson-databindartifactId version${jackson.version}versiondependencydependency groupIdcom.fasterxml.jackson.coregroupId artifactIdjackson-coreartifactId version${jackson.version}versiondependencydependency groupIdcom.fasterxml.jackson.coregroupId artifactIdjackson-annotationsartifactId version${jackson.version}versiondependencypublic class JsonUtils {
 
private static final Logger logger = LoggerFactory.getLogger(JsonUtils.class);
 
private static ObjectMapper objectMapper;
 
static {
objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false);
objectMapper.getSerializationConfig().setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);
 
 
}
這里是初始化一個ObjectMapper,並做些配置,下面就這三個配置坐下講解:
DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES:在遇到類中沒有的屬性時,是否反序列化失敗。這個很容易理解,有時候我們可能只需要json中的某幾個屬性,序列化到某個類中,那么多余的那些屬性,在類中是沒有定義的,而反序列化是根據類中屬性的setter和getter來反序列化的,沒有的屬性自然也沒有setter和getter,所以,如果不指明為false,那么就會反序列化失敗,這里如果沒有特殊的嚴格要求,還是設置為false。
SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS:對於Date類型,是否序列化為timestamps,這里控制的Date類型的屬性,序列化的時候如何輸出,默認為true,在2.x我們還可以通過
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
private Date date;
來指明序列化的時間格式。
JsonSerialize.Inclusion.NON_NULL:指明序列化的時候是否輸出屬性為null的字段,默認為
false
下面附上object2json json2object json2list json2map等幾個常用的方法:
public static String object2Json(Object object) {
if (object == null) {
return "";
}
try {
return objectMapper.writeValueAsString(object);
 
} catch (Exception e) {
logger.info("object2Json exception. object:" + object.toString(), e);
return "";
}
}
 
/**
* json轉換成java bean
* */
public static <T> T json2Object(String json, Class<T> clazz) {
if (StringUtils.isBlank(json)) {
return null;
}
try {
return objectMapper.readValue(json, clazz);
} catch (IOException e) {
logger.error("json2Object exception. json:" + json, e);
return null;
}
}
 
public static <T> List<T> toList(String json) {
try {
return objectMapper.readValue(json, List.class);
} catch (Throwable var2) {
logger.error("fs",var2);
return null;
}
}
 
public static <K,V> Map<K,V> toMap(String json) {
try {
return objectMapper.readValue(json, Map.class);
} catch (Throwable var2) {
logger.error("fs",var2);
return null;
}
}
以上是1.x的使用,下面是2.x的使用,具體配置 方法基本類似,但是在處理反序列化為list或者map的時候,是有些區別的。
public class JsonUtils {
 
private static final Logger logger = LoggerFactory.getLogger(JsonUtils.class);
 
private static ObjectMapper objectMapper;
 
static {
objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
 
}
這里的三個配置和1.x的配置含義一樣,只是配置的方法有些變化。當然里面還有很多用用的配置,可以自己研究。
我們這里只附上2.x的json2list json2map,其他方法和1.x一樣:
/**
* json轉換成List<Object>
*
* */
public static <T> List<T> json2List(String json, Class<T> clazz) {
if (StringUtils.isBlank(json)) {
return Lists.newArrayList();
}
try {
JavaType javaType = objectMapper.getTypeFactory().constructParametricType(ArrayList.class, clazz);
return objectMapper.readValue(json, javaType);
} catch (IOException e) {
logger.error("json2List exception. json:" + json, e);
return Lists.newArrayList();
}
}
 
/**
* json轉換map<Object,Object>
* */
public static <K,V> Map<K,V> json2Map(String json, Class<K> keyClass, Class<V> valueClass) {
if (StringUtils.isBlank(json)) {
return Maps.newHashMap();
}
 
try {
JavaType javaType = objectMapper.getTypeFactory().constructParametricType(HashMap.class, keyClass, valueClass);
return objectMapper.readValue(json, javaType);
} catch (IOException e) {
logger.error("json2Map exception. json:" + json, e);
return Maps.newHashMap();
}
}
 
以上是1.x和2.x通過ObjectMapper進行序列化和反序列化的例子。注意,ObjectMapper是線程安全的,因此我們可以設置成static,只有一份就好。
 
1.x和2.x里都有一個JsonNode類,來具體獲取某個json串里的某個字段,具體使用基本類似。我們下面只附上最簡單的使用:
JsonNode jsonNode = objectMapper.readTree(userJson);
System.out.println(jsonNode.get("id").intValue());
System.out.println(jsonNode.get("username").textValue());
 
文章的結尾,附上和具體配置相關的鏈接:
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM