app客户端中,发现平台上新添加的栏目在客户端上无法显示,经过处理之后才发现是返回的json字符串中有一个属性值为空出现的问题。当属性值为null时,json解析就会中断,导致接下来的数据无法正确获取。原则上来讲服务器端发送的json字符串不允许存在属性值为空的情况,但是如果服务器端发送了null的属性值,客户端也必须要解决。
解决思路:将属性值 null 转换成“”
目前app用的是sdk自带的json来解析,为了便于使用,使用了Google推荐的gson框架来解析
解决方法如下
1.经过搜索可以用下面的方法
Gson gson = new GsonBuilder().serializeNulls().create();
但是这个却无法解决反序列问题,怎么解决呢?我在stackoverflow上找到了这个问题,亲测有效、
http://stackoverflow.com/questions/9483348/gson-treat-null-as-empty-string/24252578#24252578
2.解决办法如下
Gson gson = new GsonBuilder().registerTypeAdapterFactory(new NullStringToEmptyAdapterFactory()).create(); //然后用上面一行写的gson来序列化和反序列化实体类type gson.fromJson(json, type); gson.toJson(type);
//NullStringToEmptyAdapterFactory的代码
public class NullStringToEmptyAdapterFactory<T> implements TypeAdapterFactory { @SuppressWarnings("unchecked") 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 StringNullAdapter(); } }
// StringNullAdapter代码
public class StringNullAdapter extends TypeAdapter<String> { @Override public String read(JsonReader reader) throws IOException { // TODO Auto-generated method stub if (reader.peek() == JsonToken.NULL) { reader.nextNull(); return ""; } return reader.nextString(); } @Override public void write(JsonWriter writer, String value) throws IOException { // TODO Auto-generated method stub if (value == null) { writer.nullValue(); return; } writer.value(value); } }