1. 程式人生 > >Retrofit && RxJava php android 互動時Json to list個別item為null時處理

Retrofit && RxJava php android 互動時Json to list個別item為null時處理

標題一頭霧水,直接上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]