使用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());
文章的結尾,附上和具體配置相關的連接: