亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

Gson 在使用中的一些技巧

標簽:
Android

简介

前段时间在换成gson 重写下解析遇到一些问题,之前是使用JSONObject 进行解析,在使用GSON 之后发现解析数据错误和获取不到值得问题。

  1. 后台格式不规范 

    例如:   
    有值时返回:
    
         {
         person:{"name":"wang",age=17}
         }
    
    有没有值时返回:
    
        {
        person:[]
        }
    
    这个时候用gson就会抛出解析异常。   
    **解决方案:**(使用 TypeAdapterFactory)
final static class SafeTypeAdapterFactory implements TypeAdapterFactory{  
  
        @Override  
        public  TypeAdapter create(Gson gson, final TypeToken type) {  
            final TypeAdapter delegate = gson.getDelegateAdapter(this,type);  
            return new TypeAdapter() {  
                @Override  
                public void write(JsonWriter out, T value) throws IOException {  
                    try {  
                        delegate.write(out, value);  
                    } catch (IOException e) {  
                        delegate.write(out, null);  
                    }  
                }  
  
                @Override  
                public T read(JsonReader in) throws IOException {  
                    try {  
                        return delegate.read(in);  
                    } catch (IOException e) {  
                        in.skipValue();  
                        return null;  
                    } catch (IllegalStateException e) {  
                        in.skipValue();  
                        return null;  
                    } catch (JsonSyntaxException e) {  
                        in.skipValue();  
                        if(type.getType() instanceof Class){  
                            try {  
                                return (T) ((Class)type.getType()).newInstance();  
                            } catch (Exception e1) {  
  
                            }  
                        }  
                        return null;  
                    }  
                }  
            };  
        }  
    }

使用GSON 时:

Gson myGson = new GsonBuilder().registerTypeAdapterFactory(new SafeTypeAdapterFactory()).create();

例如解析下面这样的bean:

class Bean{
   Inner in;
   String a;
   String b;   class Inner{
      String c;
   }
}

返回的Bean 就会是 in = new Inner();其他的异常就会赋值为null,具体可以根据自己需要修改。  
2. 解析bool 类型时服务器有两个写法:第一种 True 或者 False ,第二种 0 代表 False 1 代表 True。

我在bean 中都使用 boolean 来表示该值

解决方案:(使用TypeAdapter)

Gson myGson = new GsonBuilder()
              .registerTypeAdapter(boolean.class, new JsonDeserializer<Boolean>() {                    @Override
                    public Boolean deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {                        try {                            return json.getAsInt() == 1;
                        }catch (NumberFormatException e){                            return json.getAsBoolean();
                        }
                    }
                }).create();

3.对于bean 中有部分属性需要忽略  
解决方案:(使用ExclusionStrategy)

创建注解类 Exclude

@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.FIELD)public @interface Exclude {
}

在gson中配置 忽略带有Exclude的属性:

Gson gson = new GsonBuilder()
                .setExclusionStrategies(new ExclusionStrategy(){                @Override
        public boolean shouldSkipField(FieldAttributes f) {            return f.getAnnotation(Exclude.class) != null;
        }        @Override
        public boolean shouldSkipClass(Class<?> clazz) {            return false;
        }
})

使用时在需要忽略的属性上标记@Exclude 即可:

class Mock{
String name;
String age;@ExcludeString gender;
}

原文链接:http://www.apkbus.com/blog-822724-68250.html

點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消