fastjson使用问题总结
fastjson生成json时Null属性不显示的解决方法
分析
序列化时默认会将null对应的key值过滤掉,例如:
Map < String , Object > jsonMap = new HashMap< String , Object>();
jsonMap.put("a",1);
jsonMap.put("b","");
jsonMap.put("c",null);
jsonMap.put("d","wuzhuti.cn");
String str = JSONObject.toJSONString(jsonMap);
System.out.println(str);
//输出结果:{"a":1,"b":"",d:"wuzhuti.cn"}
解决办法
使用JSONObject.toJSONString(Object object, SerializerFeature.features)方法
-
QuoteFieldNames———-输出key时是否使用双引号,默认为true
-
WriteMapNullValue——–是否输出值为null的字段,默认为false
-
WriteNullNumberAsZero—-数值字段如果为null,输出为0,而非null
-
WriteNullListAsEmpty—–List字段如果为null,输出为[],而非null
-
WriteNullStringAsEmpty—字符类型字段如果为null,输出为”“,而非null
-
WriteNullBooleanAsFalse–Boolean字段如果为null,输出为false,而非null
Map < String , Object > jsonMap = new HashMap< String , Object>();
jsonMap.put("a",1);
jsonMap.put("b","");
jsonMap.put("c",null);
jsonMap.put("d","wuzhuti.cn");
String str = JSONObject.toJSONString(jsonMap,SerializerFeature.WriteMapNullValue);
System.out.println(str);
//输出结果:{"a":1,"b":"","c":null,"d":"wuzhuti.cn"}
含有泛型的反序列化
当对含有泛型反序列化时,应该使用:
注意:使用new TypeReference<>(){}的时候,在<>中不能直接指定泛型,必须强制指定目标对象,否则转换可能会出错(看下一篇)
//查询结果反序列化(带泛型)
/**
* OK!!!
* msg --待反序列化的字符串
* QueryResult<U> --含有泛型的对象,里面的U是QueryResult中一个对象类型属性中一个属性的泛型,所以并不是在TypeReference<>中指定的泛型
*/
QueryResult<U> queryResult = JSON.parseObject(msg,new TypeReference<QueryResult<U>>(){}.getType());
public class QueryResult<U> {
private String status;
private Object message;
private ResultBean<U> result;
private Object callback;
}
带泛型反序列化时类型转换出错问题
在使用含有泛型的反序列化时,使用new TypeReference<>(){}中,<>里面填写的类型引用必须强制指定目标对象
,如果使用泛型,在转换的时候也可以转换,但是转换后的对象类型不是自己指定泛型的类型,而是JSONObject,进行操作时可能会报类型转换异常错误,且,转换结果会将值为null的属性自动忽略
/**
* ERROR!!!
* <>中填写的是泛型U --此时的U是QueryResult中一个属性的泛型
* 当函数调用通过指定泛型也可以进行转换,但得到的类型是JSONObject类型
* 且,转换结果会将值为null的属性自动忽略
*
* 正确:填写类型引用必须强制指定目标对象
*/
QueryResult<U> queryResult = JSON.parseObject(msg,new TypeReference<QueryResult<U>>(){}.getType());
public class QueryResult<U> {
private String status;
private Object message;
private U result; //ResultBean
private Object callback;
}
/**
* OK!!!
*
* <>中必须强制指定目标对象
*/
QueryResult<FareDetail> queryResult = JSON.parseObject(msg,new TypeReference<QueryResult<FareDetail>>(){}.getType());
TypeReference源代码注释:
/**
* Represents a generic type {@code T}. Java doesn't yet provide a way to
* represent generic types, so this class does. Forces clients to create a
* subclass of this class which enables retrieval the type information even at
* runtime.
*
* <p>For example, to create a type literal for {@code List<String>}, you can
* create an empty anonymous inner class:
*
* <pre>
* TypeReference<List<String>> list = new TypeReference<List<String>>() {};
* </pre>
* This syntax cannot be used to create type literals that have wildcard
* parameters, such as {@code Class<?>} or {@code List<? extends CharSequence>}.
*/
最后一行作者有说明:此语法不能用于创建具有通配符的类型参数,比如{@code Class<?>}或{@code List<? extends CharSequence>}。