Caused by: java.lang.NumberFormatException: empty String

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

在gson解析json数据的时候,如果一个int类型返回的字段为"",就会报上面的异常,如果返回的是null就没这个问题,但实际上这个字段是后端返回的,有可能改动比较大,这个时候就需要前端进行处理,解决方法很简单,就是在创建gson的时候添加几行代码就行

        Gson gson = new GsonBuilder()
                .registerTypeAdapter(int.class, IntTypeAdapter)
                .registerTypeAdapter(Integer.class, IntTypeAdapter).create();
    private static TypeAdapter<Number> IntTypeAdapter = new TypeAdapter<Number>() {
        @Override
        public void write(JsonWriter out, Number value) throws IOException {
            out.value(value);
        }

        @Override
        public Number read(JsonReader in) throws IOException {
            if (in.peek() == JsonToken.NULL) {
                in.nextNull();
                return null;
            }
            try {
                String result = in.nextString();
                if ("".equals(result)) {
                    return null;
                }
                return Integer.parseInt(result);
            } catch (NumberFormatException e) {
                throw new JsonSyntaxException(e);
            }
        }
    };

如果想添加long类型还可以继续register,

        Gson gson = new GsonBuilder()
                .registerTypeAdapter(long.class, LongTypeAdapter)
                .registerTypeAdapter(Long.class, LongTypeAdapter)
                .registerTypeAdapter(int.class, IntTypeAdapter)
                .registerTypeAdapter(Integer.class, IntTypeAdapter).create();
private static TypeAdapter<Number> LongTypeAdapter = new TypeAdapter<Number>() {
    @Override
    public void write(JsonWriter out, Number value) throws IOException {
        out.value(value);
    }

    @Override
    public Number read(JsonReader in) throws IOException {
        if (in.peek() == JsonToken.NULL) {
            in.nextNull();
            return null;
        }
        try {
            String result = in.nextString();
            if ("".equals(result)) {
                return null;
            }
            return Long.parseLong(result);
        } catch (NumberFormatException e) {
            throw new JsonSyntaxException(e);
        }
    }
};

如果想要添加更多类型,可以参照上面继续添加即可。如果使用了retrofit,可以在初始化的时候添加

            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(sBaseUrl)
                    .addConverterFactory(GsonConverterFactory.create(getGson()))
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .client(httpClient)
                    .build();
    private static Gson getGson() {
        return new GsonBuilder()
                .registerTypeAdapter(long.class, LongTypeAdapter)
                .registerTypeAdapter(int.class, IntTypeAdapter)
                .registerTypeAdapter(Integer.class, IntTypeAdapter)
                .registerTypeAdapter(Long.class, LongTypeAdapter).create();
    }

猜你喜欢

转载自blog.csdn.net/abcdef314159/article/details/89887391