Retrofit && RxJava php android 互動時Json to list個別item為null時處理
阿新 • • 發佈:2019-02-11
標題一頭霧水,直接上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]