一.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字符串时不会报代码长度过长.