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);
    }
}