Retrofit && RxJava php android 交互时Json to list个别item为null时处理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010369338/article/details/83543500

标题一头雾水,直接上json吧,有需要的同学一眼就懂

{
   "data": {
   	"player": [
   		[],
   		[],
   		[],
   		[],
   		[], {
   			"id": "1024",
   			"name": "xxx",
   			"phone": "111111111",
   			"avatar": "xxx.png",
   			"status": 1
   		}, [],
   		[],
   		[]
   	]
   },
   "code": 200,
   "msg": "xxxx"
}

某种原因,你需要一个位置不变的列表,前后都可能是null

由于PHP为弱类型语言,所以list转json的时候就会出现上述情况,iOS遇到[]会直接转换为null,而Android则会抛出JsonParseException,所以需要做特殊处理。
(因为前五个item是list,而第六item才是JavaBean)

    protected static Retrofit getRetrofit(Retrofit.Builder builder) {
        return builder.addConverterFactory(GsonConverterFactory.create(new GsonBuilder().registerTypeHierarchyAdapter(List.class, new JsonDeserializer<List<?>>() {
            @Override
            public List<?> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) {
                Logger.d("getRetrofit deserialize JsonElement : " + json);
                if (json.isJsonArray()) {
                    JsonArray array = json.getAsJsonArray();
                    Type itemType = ((ParameterizedType) typeOfT).getActualTypeArguments()[0];
                    List list = new ArrayList<>();
                    for (int i = 0; i < array.size(); i++) {
                        JsonElement element = array.get(i);
                        Object item;
       ________________________________________________________________________________
                        try {
                            item = context.deserialize(element, itemType);
                        } catch (JsonParseException e) {
                            item = null;
                        }  
       _________________________________________________________________________________
                        list.add(item);
                    }
                    return list;
                } else {
                    //和接口类型不符,返回空List
                    return Collections.EMPTY_LIST;
                }
            }
        }).generateNonExecutableJson().serializeNulls().create()))
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .client(initOkHttpClient())
                .build();
    }

注意划线区域,我们将throws JsonParseException改为try catch,并在捕获异常后item = null就可以了

输出

[null, null, null, null, null, PlayerEntity{id='1025', name='xx',avatar='xxx.png', status=1}, null, null, null]

参考文章https://www.jianshu.com/p/3108f1e44155

猜你喜欢

转载自blog.csdn.net/u010369338/article/details/83543500