当正常使用时 json中有字符串是" " 和null是,gson是不能正常解析,报空指针异常的
StringRequest stringRequest = new StringRequest(url, new Response.Listener<String>() { @Override public void onResponse(String response) { Log.e("url", "7"); try { HomeInfo info = gson.fromJson(response,HomeInfo.class); list = info.getHistorys(); onGetDataSuccess(getDataType); } catch (Exception e) { getDefult(getDataType); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { getDefult(getDataType); Log.e("url", "9"); } }) {}; requestQueue.add(stringRequest);
这个,空指针异常 ,在 try 括号 加
Gson gson = new GsonBuilder().registerTypeAdapterFactory(new NullStringToEmptyAdapterFactory()).create();这句,不过后面的 new Null....... 是从写的方法
public class NullStringToEmptyAdapterFactory<T> implements TypeAdapterFactory { @SuppressWarnings("unchecked") public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) { Class<T> rawType = (Class<T>) type.getRawType(); if (rawType != String.class) { return null; } return (TypeAdapter<T>) new StringNullAdapter(); } } public class StringNullAdapter extends TypeAdapter<String> { @Override public String read(JsonReader reader) throws IOException { // TODO Auto-generated method stub if (reader.peek() == JsonToken.NULL) { reader.nextNull(); return ""; } return reader.nextString(); } @Override public void write(JsonWriter writer, String value) throws IOException { // TODO Auto-generated method stub if (value == null) { writer.nullValue(); return; } writer.value(value); } }加上这两个重写的就可以处理空指针异常了
接下来的问题可能会出现返回乱码问题
就在
onErrorResponse
这个方法的大括号后接着重写
parseNetworkResponse
代码:
@Override protected Response<String> parseNetworkResponse(NetworkResponse response){ try { String jsonString = new String(response.data, "UTF-8"); return Response.success(jsonString, HttpHeaderParser.parseCacheHeaders(response)); } catch (UnsupportedEncodingException e) { return Response.error(new ParseError(e)); } catch (Exception je) { return Response.error(new ParseError(je)); } }
个人遇到的问题,分享下,谢谢