retrofit 2.0 gson怎么解决gson解析null替换空字符串的问题

其他回答(1)
ist&ParentModel& parentModel & &你可以先序列化看看个你的那个字符串有什么区别
园豆:9721
&&&您需要以后才能回答,未注册用户请先。问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
retrofit中gsonconverter 对于空集合 array:[] 这种解析会报错 请问有什么解决办法吗
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
自定义类继承Converter.Factory,改写convert()方法如下:
public T convert(ResponseBody value) throws IOException {
String response = value.string();
return gson.fromJson(response, type);
} catch (JsonSyntaxException e) {
org.json.JSONObject json = new org.json.JSONObject(response);
String data = json.getString("data");
if (TextUtils.isEmpty(data) || data.equals("[]")) {
// 添加对空Json数组的处理逻辑
} catch (JSONException e1) {
throw new ApiException(ApiException.JSON_PARSE_ERROR, ApiException.JSON_PARSE_ERROR_MESSAGE);
} finally {
value.close();
分享到微博?
你好!看起来你挺喜欢这个内容,但是你还没有注册帐号。 当你创建了帐号,我们能准确地追踪你关注的问题,在有新答案或内容的时候收到网页和邮件通知。还能直接向作者咨询更多细节。如果上面的内容有帮助,记得点赞 (????)? 表示感谢。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
扫扫下载 AppGson解析null替换为空字符串 - 博客频道 - CSDN.NET
Grandaunt的博客
分类:gson解析
json解析有很多工具,这里说的是最常用也是解析速度最快的Gson,Gson是google家出的,有一个缺点就是无法设置null替换,
我们只能手动的批量替换服务器返回的null了,正常的接口定义的时候是绝对不允许服务器返回null的,后台结果却总会出现null!
如果搜索的话有一个常见的答案,
Gson gson = new GsonBuilder().serializeNulls().create();
但是这个却无法解决反序列问题,怎么解决呢?我在stackoverflow上找到了这个问题,亲测有效
解决办法如下:
= new GsonBuilder().registerTypeAdapterFactory(new NullStringToEmptyAdapterFactory()).create();
//然后用上面一行写的gson来序列化和反序列化实体类type
gson.fromJson(json, type);
gson.toJson(type);
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& {
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) {
writer.nullValue();
writer.value(value);
排名:千里之外
(1)(72)(1)(3)(2)(1)(1)(10)(3)(1)(2)(1)(2)(1)(4)(2)(1)(1)(1)(1)5948人阅读
Android开发(1068)
在实际开发项目中,服务器经常会用空字符串 “” 作为返回结果表示空值 ,但这在Gson当中就会遇到问题,如果这项数据的类型不是字符串,Gson解析就会报错
我们希望程序可以自动将空字符串解析为对应类型的空值,比如整型就解析为0,List型就解析为一个Empty List
这个问题可以说是我用Retrofit+Gson以来最大的一个坑,以至于我在研究时差不多都要把源码看完了
提一件离奇的事是,Gson在用整型解析空字符串时,报的居然是”Inavalid double”的错误
经过研究源码后发现,Gson会优先尝试解析为整型,解析失败并不会报错误,
继续尝试解析为double型,再失败才会报错,所以得到了”Inavalid double”
解决方案:
针对整型的解析,先写一个解析适配器,实现JsonSerializer, JsonDeserializer
重写解析方法,先尝试用String类型解析,如果等于空字符串”“,则返回0值
否则再尝试用整型解析,并且catch数字格式异常转成Json解析异常抛出
public class IntegerDefault0Adapter implements JsonSerializer&Integer&, JsonDeserializer&Integer& {
public Integer deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context)
throws JsonParseException {
if (json.getAsString().equals("")){
} catch (Exception ignore){
return json.getAsInt();
} catch (NumberFormatException e) {
throw new JsonSyntaxException(e);
public JsonElement serialize(Integer src, Type typeOfSrc, JsonSerializationContext context) {
return new JsonPrimitive(src);
然后在GsonBuilder里注册适配器到类型Integer与类型int
public static Gson buildGson() {
if (gson == null) {
gson = new GsonBuilder()
.setDateFormat("yyyy-MM-dd HH:mm:ss")
.registerTypeAdapter(Integer.class, new IntegerDefault0Adapter())
.registerTypeAdapter(int.class, new IntegerDefault0Adapter())
.create();
再在构建Retrofit时用这个自定义的Gson替换掉原生的
Retrofit = new Retrofit.Builder()
.baseUrl(API_SERVER + "/")
//传入buildGson生成的自定义Gson
.addConverterFactory(GsonConverterFactory.create(buildGson()))
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(mOkHttpClient)
这样Gson在遇到整型解析时可以将空字符串解析为0了
然后我打算用同样的方式解决List的解析问题,但没想到情况没有这么简单。
因为List并不像整形一样是一个基本类型,List本身在数据解析的时候是要带泛型的
我不可能在构建的时候就定好集合里的数据类型。
而如果不定泛型里的数据类型,重写适配器就得根据运行时遇到的类型分别进行操作,这无异于把Gson的工作重新做一遍。
经过研究源码后发现Gson对待List也并非当做一个类型去解析的
而是在初始化时带有一个CollectionTypeAdapterFactory,在遇到JsonArray类型的数据就会调用集合类型的解析器,然后再适配集合里的对应数据类型。总之一句话就是,挺复杂,并且不怎么能扩展。
经过研究后我找到的解决方案是:
通过注解方式@JsonAdapter可以指定对应的适配器,优先级是高于默认的CollectionTypeAdapterFactory,和通过GsonBuilder传入的适配器的。
然后还是拷贝CollectionTypeAdapterFactory出来,改一份ListTypeAdapterFactory出来
public final class ListTypeAdapterFactory implements TypeAdapterFactory {
public &T& TypeAdapter&T& create(Gson gson, TypeToken&T& typeToken) {
Type type = typeToken.getType();
Class&? super T& rawType = typeToken.getRawType();
if (!List.class.isAssignableFrom(rawType)) {
return null;
Type elementType = $Gson$Types.getCollectionElementType(type, rawType);
TypeAdapter&?& elementTypeAdapter = gson.getAdapter(TypeToken.get(elementType));
@SuppressWarnings({"unchecked", "rawtypes"})
TypeAdapter&T& result = new Adapter(gson, elementType, elementTypeAdapter);
private static final class Adapter&E& extends TypeAdapter&List&E&& {
private final TypeAdapter&E& elementTypeA
public Adapter(Gson context, Type elementType,
TypeAdapter&E& elementTypeAdapter) {
this.elementTypeAdapter = new TypeAdapterRuntimeTypeWrapper&E&(
context, elementTypeAdapter, elementType);
public List&E& read(JsonReader in) throws IOException {
if (in.peek() == JsonToken.NULL) {
in.nextNull();
return null;
List&E& list = new ArrayList&&();
in.beginArray();
while (in.hasNext()) {
E instance = elementTypeAdapter.read(in);
list.add(instance);
in.endArray();
} catch (IllegalStateException e){
if (!"".equals(in.nextString())){
public void write(JsonWriter out, List&E& list) throws IOException {
if (list == null) {
out.nullValue();
out.beginArray();
for (E element : list) {
elementTypeAdapter.write(out, element);
out.endArray();
最后就是Model类里面注解指定
public class UserListModel{
@JsonAdapter(ListTypeAdapterFactory.class)
List&UserProfileModel&
这样Gson就能将空字符串解析成为空列表了。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:9176895次
积分:69578
积分:69578
排名:第23名
原创:517篇
转载:937篇
评论:2649条
如果您认为本博客不错,读后觉得有收获,不妨打赏赞助我一下,让我有动力继续写出高质量的博客。
赠人玫瑰,手有余香。分享技术,传递快乐。
QQ交流群:
有心课堂会员,请加入VIP QQ交流群:
文章:28篇
阅读:91665
文章:69篇
阅读:421605

我要回帖

更多关于 retrofit gson null 的文章

 

随机推荐