版权声明:本文为博主原创文章,未经博主允许不得转载。 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]