空值
对象某一属性为空时,gson和fastjson的默认操作都是直接不序列化该属性,以减小序列化后的大小。
那么,怎么样让它序列化进去呢?
gson:
new GsonBuilder().serializeNulls()
但存在问题:字符串会被序列化为"null",要排除这种操作,你需要:
参考: Gson对字符串null的字段转换为空字符串输出
其他:对象为null时,会被序列化为{},list为null时,序列化为[]
在这种情况下,应该自己写一个StringUtils.isEmpty(str),把这种"null"的情况考虑进去.
gsonBuilder.registerTypeAdapter(String.class, STRING);
//STRING 为自定义Strig适配器
private static final TypeAdapter<String> STRING = new TypeAdapter<String>()
{
public String read(JsonReader reader) throws IOException
{
if (reader.peek() == JsonToken.NULL)
{
reader.nextNull();
return "";
}
return reader.nextString();
}
public void write(JsonWriter writer, String value) throws IOException
{
if (value == null)
{
// 在这里处理null改为空字符串
writer.value("");
return;
}
writer.value(value);
}
};
fastjson:
参考:打印fastjson对象时,如果内部键值为null,则该键不会打印出来
使用提供的重载方法
public static final String toJSONString(Object object, SerializerFeature... features)
//使用时:
String text = JSON.toJSONString(obj, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullListAsEmpty);
提供的feature有:
WriteNullListAsEmpty 将Collection类型字段的字段空值输出为[]
WriteNullStringAsEmpty 将字符串类型字段的空值输出为空字符串 “”
WriteNullNumberAsZero 将数值类型字段的空值输出为0
WriteNullBooleanAsFalse 将Boolean类型字段的空值输出为false
是否有必要
前后端同一套技术选型时,都用默认设置,没有必要开启空值的序列化.
在java里,反序列化时,如果json字符串里没有对应的键,则该属性自动设为类定义中的默认值,不会出现属性丢失的情况.
如果用的不同一套技术选型,则留意这种极端情况,处理好空的判断,空的初始化.
另外需注意:
- 封装好方法名,让实际使用时自由选择是过滤还是不过滤null值,而不要覆盖原先的默认行为
防止混淆导致的解析异常
- 二逼姿势: 加get ,set方法, 没用,依然会混淆.
- 一般姿势: 将项目中所有javabean放在同一个包下,然后让这个包不混淆:
-dontwarn io.xxx.bbb.entity
-keep class io.xxx.bbb.entity.**{*;}
- 文艺姿势: 定义一个空接口,然后让这个接口的实现类都不混淆, 然后javabean定义时实现此接口.
-keep class io.yyy.uuu.common.interfaces.ProguardDisable
-keepnames class * implements io.yyy.uuu.common.interfaces.ProguardDisable
-keepclassmembers class * implements io.yyy.uuu.common.interfaces.ProguardDisable { *; }
实际项目中一般推荐第二种为主,第三种为辅