一.fastjson序列化與反序列化方式
1.fastjson依賴版本:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
2.json字符串轉換java對象:
a)TypeReference方式轉換java對象
MessageDTO<JSONObject> messageDTO = JSONObject.parseObject(json,new TypeReference<MessageDTO<JSONObject>>(){});
注意:
i.轉換後的JSONObject中的屬性順序是亂序的。
ii.這個方式比較安全,轉換Map時其他方法在某些特殊情況,會報轉換報錯。
b)轉換java對象
JSONObject.toJavaObject(json,Java對象.class)
c)轉換成JSONObject對象
JSONObject.parseObject(json)
d)class轉換成Java對象
JSONObject.parseObject(json,Java對象.class)
3.java對象轉換json字符串
通過屬性過濾器(SerializeFilter)排除屬性與包含屬性,來控制轉換成JSON字符串屬性輸出:
String[] excludeProperties = {"屬性名1", "屬性名2"};
String[] includeProperties = {"屬性名1", "屬性名1"};
PropertyPreFilters filters = new PropertyPreFilters();
PropertyPreFilters.MySimplePropertyPreFilter excludefilter = filters.addFilter();
excludefilter.addExcludes(excludeProperties);
PropertyPreFilters.MySimplePropertyPreFilter includefilter = filters.addFilter();
includefilter.addIncludes(includeProperties);
a)轉json字符串默認忽略值爲null的屬性:
json = JSONObject.toJSONString(obj);
或
json = JSONObject.toJSONString(obj, SerializerFeature.PrettyFormat);
b)包含值爲null的屬性:
json = JSONObject.toJSONString(obj, SerializerFeature.WriteMapNullValue);
或
json = JSONObject.toJSONString(obj, SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue);
c)默認忽略值爲null的屬性,排除屬性名1和屬性名2屬性
json = JSONObject.toJSONString(obj, excludefilter, SerializerFeature.PrettyFormat);
d)包含值爲null的屬性,排除屬性名1和屬性名2屬性
json = JSONObject.toJSONString(obj, excludefilter, SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue);
e)默認忽略值爲null的屬性,包含屬性名1和屬性名2屬性
json = JSONObject.toJSONString(obj, includeProperties, SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue);
f)包含值爲null的屬性,強制屬性按a-z排序
JSONObject.toJSONString(obj, SerializerFeature.WriteMapNullValue,SerializerFeature.MapSortField)
注意:
i)在實體類添加@JSONType(orders={"屬性1","屬性2","屬性3"}) 指定屬性的輸出順序:
@JSONType(orders={"屬性1","屬性2","屬性3"})
public class 實體類 {
...
}
ii)在屬性上添加@JSONField(ordinal = 1) 指定屬性的輸出順序
public class 實體類 {
@JSONField(ordinal = 1)
private String 屬性1;
@JSONField(ordinal = 2)
private Integer 屬性2;
}
g)默認創建屬性保持屬性
JSONObject jsonObject = new JSONObject(true);
jsonObject.put("屬性1","屬性值")
4.常見問題:
a)Java對象屬性有null值時,該屬性在轉json時會被忽略問題。
解決方案:
在轉化json字符串時,增加SerializerFeature.WriteMapNullValue參數,例如:JSONObject.toJSONString(obj,SerializerFeature.WriteMapNullValue);
b)Java對象轉化json字符串後,反序列化爲非Java對象(JsonObject或Map<String,Object>)後,轉化json字符串時屬性會錯亂問題。
注意:
Java對象轉化json字符串時:有序的
非Java對象(JsonObject或Map<String,Object>),轉化json字符串時:無序的
解決方案:
在轉化json字符串時,增加SerializerFeature.MapSortField參數,進行強制排序。
例如:JSONObject.toJSONString(messageDTO.getBody(), SerializerFeature.WriteMapNullValue,SerializerFeature.MapSortField)
c)fastjson-1.2.7.jar 轉化json字符串時會報代碼長度過長:
java.lang.ClassFormatError: Invalid method Code length 66865 in class file com/alibaba/fastjson/serializer/ASMSerializer_6_UserKdlb
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
或
java.lang.ClassFormatError: JVMCFRE042 bytecode array size > 65535; class=Serializer_57, offset=53261
解決方案:
升級到1.2.13以後版本,我代碼中升級到1.2.47
二.jackson序列化與反序列化方式
1.依賴版本:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.5.3</version>
</dependency>
2.工具類:
public class JsonUtil {
public static ObjectMapper objectMapper;
static {
objectMapper = new ObjectMapper();
}
public static <T> T convertToObject(String jsonStr, Class<T> valueType) {
try {
if (StringUtils.isBlank(jsonStr)) {
return null;
}
return objectMapper.readValue(jsonStr, valueType);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static <T> T convertToObject(String jsonStr, TypeReference<T> valueTypeRef) {
try {
if (StringUtils.isBlank(jsonStr)) {
return null;
}
return objectMapper.readValue(jsonStr, valueTypeRef);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static <T> T convertToObject(String jsonStr, JavaType javaType) {
try {
if (StringUtils.isBlank(jsonStr)) {
return null;
}
return objectMapper.readValue(jsonStr, javaType);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static String convertToJson(Object object) {
try {
if (object == null) {
return null;
}
return objectMapper.writeValueAsString(object);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static <T> T convertToObejctFromKey(String jsonStr,String key,Class<T> valueType)
{
try{
JsonNode node = objectMapper.readTree(jsonStr);
String nodeString=node.get(key).toString();
return convertToObject(nodeString,valueType);
}catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static String getNodeString(String jsonStr,String key)
{
try{
JsonNode node = objectMapper.readTree(jsonStr);
return node.get(key).textValue();
}catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static List<JsonNode> getJsonObject(String jsonStr, String key){
try{
JsonNode node = objectMapper.readTree(jsonStr);
if(node.get(key).isArray()){
return node.findValues(key);
}
}catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static JavaType BuildJavaType(Class<?> c1, Class<?> c2) {
return objectMapper.getTypeFactory().constructParametricType(c1, c2);
}
}
3.java序列化json字符串
JsonUtil.convertToJson(obj)
注意:轉化json字符串時不會報代碼長度過長.