RxJavaRetrofitDemo
RxJavaRetrofitDemo copied to clipboard
gson 解析class 对象,在buildGson中写死了
我也是刚接触这个rxjava ,想封装一个简单的,感觉你这个挺好的。 你是什么思路,应该可以把 private static Gson buildGson() { return new GsonBuilder() .serializeNulls() .setFieldNamingPolicy(FieldNamingPolicy.IDENTITY) // 此处可以添加Gson 自定义TypeAdapter .registerTypeAdapter(User.class, new UserTypeAdapter()) .create(); } 这段代码抽离出来吧。能简单说一下这个地方为什么这样写吗?
@zidanpiaoguo 不太明白你要表达什么意思,为什么要抽取出来呢?
这个是对应的class并不是唯一的, User.class ,本来就是一个类,而且UserTypeAdapter ,也是独有的。
你能说一下,这段代码的目的吗?为什么要在这里添加东西。
@zidanpiaoguo TypeAdapter是自定义某一个Model(User.class)的解析规则的,你可以先Google一下Gson TypeAdapter 的作用及用法
我的主要矛盾是:每个接口返回都对应一个不同的对象,你写在这里,每个接口都要加一个特有的buildGson,我明白typeadpater 是解析的,本身GsonConverterFactory.create()解析需要数据一定要这样写吗?retorfit,有吧
@zidanpiaoguo 并不需要每一个接口返回的对象都注册一个TypeAdapter,我当时注册UserTypeAdapter只是为了解决我们后台接口返回数据不规范的问题,例如:User,正常返回的时候数据是{id: 123, nickname: abc, age: 25},异常返回的时候数据就是“”空字符串,空字符串Gson解析为User对象就会抛出异常,这是不规范的,但是没办法,历史遗留问题
嗯,你那个是不是用TypeAdapter做序列化转换还是什么,如果只是为了设置空字符串, return new GsonBuilder().serializeNulls().create(); 这一句话就够了,不然你那样重新TypeAdapter , 每次请求返回的数据,都要写一个buildgson ,这个工作量太大了,我今天看了一篇关于上面那句话无法解决序列化的文章,他是用模板写的,而且要只能用于String,看来TypeAdapter是不是局限性非常大啊,你对这个TypeAdapter有深入了解吗?
@zidanpiaoguo 我注册TypeAdapter是为了解决这个异常的:IllegalStateException: Expected BEGIN_OBJECT but was STRING,目前还没找到其他更好的解决办法