使用gson将null String对象转换成空白字符串
在app开发中,页面上可能会有‘null’字眼出现,如,
姓名:null
这是因为后端返回的json数据相应字段的值为null造成的,如:
{
"name": null,
"phone": "13800138000"
}
将null显示在界面上给用户带来很不好的体验,当遇到这种问题时,最简单的方法就是显示前先判一下,可是要每个字段都这么判可得要累死了,既影响写代码的速度又不美观,最好的办法就是解析的时候将null值转换成空白字符串""
,对于使用Gson来解析的开发者,可以用以下方法来实现。
一、定义一个StringAdapter类,继承com.google.gson.TypeAdapter类,TypeAdapter类是一个抽象类,并实现它的两个抽象方法
class StringAdapter extends TypeAdapter<String> {
@Override
public void write(JsonWriter out, String value) throws IOException {
if (value == null) {
out.nullValue();
return;
}
out.value(value);
}
@Override
public String read(JsonReader in) throws IOException {
if (in.peek() == JsonToken.NULL) {
in.nextNull();
return "";
}
return in.nextString();
}
}
这两个方法一个是读、一个是写,主要用于实现序列化与反序列化,其中读是用于反序列化,即将json转换成实体类,当读到的字符串为null时就返回""
二、定义一个类型适配器工厂类,继承com.google.gson.TypeAdapterFactory类,实现create()方法
public class NullStringToEmptyAdapterFactory implements TypeAdapterFactory {
@Override
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
Class<T> rawType = (Class<T>) type.getRawType();
if (rawType != String.class) {
return null;
}
return (TypeAdapter<T>) new StringAdapter();
}
}
当对象的字段是String类型时,返回第一步中定义的StringAdapter类的对象
三、使用
Gson gsonA = new Gson();
Gson gsonB = new GsonBuilder().registerTypeAdapterFactory(new NullStringToEmptyAdapterFactory()).create();
String json="{\"name\":\"张三\",\"phone\":null}";
User user= gsonA.fromJson(json,User.class);
XbdLog.d("gsonA 姓名=%s,电话=%s",user.name,user.phone);
User user1= gsonB.fromJson(json,User.class);
XbdLog.d("gsonB 姓名=%s,电话=%s",user1.name,user1.phone);
结果:
gsonA 姓名=张三,电话=null
gsonB 姓名=张三,电话=
四、在Retrofit中使用
Gson gson = new GsonBuilder().registerTypeAdapterFactory(new NullStringToEmptyAdapterFactory()).create();
Retrofit.Builder builder = new Retrofit.Builder()
.client(new OkHttpClient.Builder().build())
.baseUrl("baseUrl")
.addConverterFactory(GsonConverterFactory.create(gson));
这样当后端返回的json数据中的String字段的值为null时,反序列化后对应的值就是""了。
由于水平有限,如果文中存在错误之处,请大家批评指正,欢迎大家一起来分享、探讨!
博客:http://blog.csdn.net/MingHuang2017
GitHub:https://github.com/MingHuang1024
Email: MingHuang1024@foxmail.com
微信:724360018