Android Gson容错处理

Gson容错处理

一般数据容错处理

如:int、double、float、string类型的数据,后台可能返回空字符串、字符串null,空对象null。

/**
 * 定义为int类型
 * 如果后台返回""或者"null",则返回0
 */
class IntegerDefault0Adapter implements JsonSerializer<Integer>, JsonDeserializer<Integer> {
    
    
    @Override
    public Integer deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
        throws JsonParseException {
    
    
        try {
    
    
            if (json.getAsString().equals("") || json.getAsString().equals("null")) {
    
    
                return 0;
            }
        } catch (Exception ignore) {
    
    
        }
        try {
    
    
            return json.getAsInt();
        } catch (NumberFormatException e) {
    
    
            throw new JsonSyntaxException(e);
        }
    }

    @Override
    public JsonElement serialize(Integer src, Type typeOfSrc, JsonSerializationContext context) {
    
    
        return new JsonPrimitive(src);
    }
}

/**
 * 定义为long类型
 * 如果后台返回""或者"null",则返回0L
 */
class LongDefault0Adapter implements JsonSerializer<Long>, JsonDeserializer<Long> {
    
    
    @Override
    public Long deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
        throws JsonParseException {
    
    
        try {
    
    
            if (json.getAsString().equals("") || json.getAsString().equals("null")) {
    
    
                return 0L;
            }
        } catch (Exception ignore) {
    
    
        }
        try {
    
    
            return json.getAsLong();
        } catch (NumberFormatException e) {
    
    
            throw new JsonSyntaxException(e);
        }
    }

    @Override
    public JsonElement serialize(Long src, Type typeOfSrc, JsonSerializationContext context) {
    
    
        return new JsonPrimitive(src);
    }
}

/**
 * 定义为double类型
 * 如果后台返回""或者"null",则返回0.00
 */
class DoubleDefault0Adapter implements JsonSerializer<Double>, JsonDeserializer<Double> {
    
    
    @Override
    public Double deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
    
    
        try {
    
    
            if (json.getAsString().equals("") || json.getAsString().equals("null")) {
    
    
                return 0.00;
            }
        } catch (Exception ignore) {
    
    
        }
        try {
    
    
            return json.getAsDouble();
        } catch (NumberFormatException e) {
    
    
            throw new JsonSyntaxException(e);
        }
    }

    @Override
    public JsonElement serialize(Double src, Type typeOfSrc, JsonSerializationContext context) {
    
    
        return new JsonPrimitive(src);
    }
}

/**
 * 定义为float类型
 * 如果后台返回""或者"null",则返回0F
 */
class FloatDefault0Adapter implements JsonSerializer<Float>, JsonDeserializer<Float> {
    
    
    @Override
    public Float deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
    
    
        try {
    
    
            if (json.getAsString().equals("") || json.getAsString().equals("null")) {
    
    
                return 0F;
            }
        } catch (Exception ignore) {
    
    
        }
        try {
    
    
            return json.getAsFloat();
        } catch (NumberFormatException e) {
    
    
            throw new JsonSyntaxException(e);
        }
    }

    @Override
    public JsonElement serialize(Float src, Type typeOfSrc, JsonSerializationContext context) {
    
    
        return new JsonPrimitive(src);
    }
}

/**
 * 定义为String类型
 * 如果后台返回字符串"null",则返回空字符串
 */
class StringDefaultAdapter implements JsonSerializer<String>, JsonDeserializer<String> {
    
    
    @Override
    public String deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
    
    
        try {
    
    
            if (json.getAsString().equals("null")) {
    
    
                return "";
            }
        } catch (Exception ignore) {
    
    
        }
        try {
    
    
            return json.getAsJsonPrimitive().getAsString();
        } catch (NumberFormatException e) {
    
    
            throw new JsonSyntaxException(e);
        }
    }

    @Override
    public JsonElement serialize(String src, Type typeOfSrc, JsonSerializationContext context) {
    
    
        return new JsonPrimitive(src);
    }
}

/**
 * 定义String类型
 * 如果后台返回字符串"null"或空对象null,则返回空字符串
 */
class StringNullAdapter extends TypeAdapter<String> {
    
    
    @Override
    public String read(JsonReader reader) throws IOException {
    
    
        if (reader.peek() == JsonToken.NULL) {
    
    
            reader.nextNull();
            return "";
        }

        String jsonStr = reader.nextString();
        if (jsonStr.equals("null")) {
    
    
            return "";
        } else {
    
    
            return jsonStr;
        }
    }

    @Override
    public void write(JsonWriter writer, String value) throws IOException {
    
    
        if (value == null) {
    
    
            writer.nullValue();
            return;
        }
        writer.value(value);
    }
}

使用:

   Gson gson = new GsonBuilder()
                .registerTypeAdapter(Integer.class, new IntegerDefault0Adapter())
                .registerTypeAdapter(int.class, new IntegerDefault0Adapter())
                .registerTypeAdapter(Double.class, new DoubleDefault0Adapter())
                .registerTypeAdapter(double.class, new DoubleDefault0Adapter())
                .registerTypeAdapter(Float.class, new FloatDefault0Adapter())
                .registerTypeAdapter(float.class, new FloatDefault0Adapter())
                .registerTypeAdapter(Long.class, new LongDefault0Adapter())
                .registerTypeAdapter(long.class, new LongDefault0Adapter())
                .registerTypeAdapter(String.class, new StringDefaultAdapter())
                .registerTypeAdapter(String.class, new StringNullAdapter())
                .create();

//正确数据
String json = "{\n" +
    "    \"name\":\"小芳\",\n" +
    "    \"age\":18,\n" +
    "    \"sex\":true,\n" +
    "    \"id\":\"1231231231\"\n" +
    "}";

System.out.println(json);
Person{name='小芳', age=18, sex=true, id='1231231231'}
//错误数据:属性值都为空字符串
String json = "{\n" +
    "    \"name\":\"\",\n" +
    "    \"age\":\"\",\n" +
    "    \"sex\":\"\",\n" +
    "    \"id\":\"\"\n" +
    "}";
Person{name='', age=0, sex=false, id=''}
//错误数据:属性值为字符串"null"
String json = "{\n" +
    "    \"name\":\"null\",\n" +
    "    \"age\":\"null\",\n" +
    "    \"sex\":\"null\",\n" +
    "    \"id\":\"null\"\n" +
    "}";
Person{name='', age=0, sex=false, id=''}
//错误数据:属性值都为空对象null
String json = "{\n" +
    "    \"name\":null,\n" +
    "    \"age\":null,\n" +
    "    \"sex\":null,\n" +
    "    \"id\":null\n" +
    "}";
Person{name='', age=0, sex=false, id=''}

不同类型容错处理

{
    
    
    "code":1,
    "message":"success",
    "data":{
    
    
        "name":"Tom",
        "age":11,
        "sex":true,
        "id":"1231231231"
    }
}
{
    
    
    "code":1,
    "message":"success",
    "data":[
        {
    
    
            "name":"Tom",
            "age":11,
            "sex":true,
            "id":"1231231231"
        },
        {
    
    
            "name":"Jim",
            "age":18,
            "sex":false,
            "id":"1231231231"
        }
    ]
}
{
    
    
    "code":1,
    "message":"success",
    "data":""
}

容错处理

class JsonFormatAdapter implements JsonDeserializer<BaseResult> {
    
    
    private Type mType;

    public JsonFormatAdapter(Type type) {
    
    
        mType = type;
    }

    @Override
    public BaseResult deserialize(JsonElement jsonElement, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
    
    
        JsonObject jsonObject = jsonElement.getAsJsonObject();
        String json = jsonObject.toString();
        JsonElement dataObject = jsonObject.get("data");
        int code = jsonObject.get("code").getAsInt();
        String message = jsonObject.get("message").getAsString();

        BaseResult result = new BaseResult();
        result.code = code;
        result.message = message;

        if (dataObject.isJsonObject() && !dataObject.isJsonNull()) {
    
    
            Gson gson = new GsonBuilder()
                .registerTypeAdapter(Integer.class, new IntegerDefault0Adapter())
                .registerTypeAdapter(int.class, new IntegerDefault0Adapter())
                .registerTypeAdapter(Double.class, new DoubleDefault0Adapter())
                .registerTypeAdapter(double.class, new DoubleDefault0Adapter())
                .registerTypeAdapter(Float.class, new FloatDefault0Adapter())
                .registerTypeAdapter(float.class, new FloatDefault0Adapter())
                .registerTypeAdapter(Long.class, new LongDefault0Adapter())
                .registerTypeAdapter(long.class, new LongDefault0Adapter())
                //.registerTypeAdapter(String.class, new StringDefaultAdapter())
                .registerTypeAdapter(String.class, new StringNullAdapter())
                .create();
            BaseResult ret = gson.fromJson(json, mType);
            return ret;
        } else if (dataObject.isJsonArray() && !dataObject.isJsonNull()) {
    
    
            Gson gson = new GsonBuilder()
                .registerTypeAdapter(Integer.class, new IntegerDefault0Adapter())
                .registerTypeAdapter(int.class, new IntegerDefault0Adapter())
                .registerTypeAdapter(Double.class, new DoubleDefault0Adapter())
                .registerTypeAdapter(double.class, new DoubleDefault0Adapter())
                .registerTypeAdapter(Float.class, new FloatDefault0Adapter())
                .registerTypeAdapter(float.class, new FloatDefault0Adapter())
                .registerTypeAdapter(Long.class, new LongDefault0Adapter())
                .registerTypeAdapter(long.class, new LongDefault0Adapter())
                //.registerTypeAdapter(String.class, new StringDefaultAdapter())
                .registerTypeAdapter(String.class, new StringNullAdapter())
                .create();
            BaseResult ret = gson.fromJson(json, mType);
            return ret;
        }
        return result;
    }
}
Gson gson = new GsonBuilder()
    .registerTypeAdapter(Integer.class, new IntegerDefault0Adapter())
    .registerTypeAdapter(int.class, new IntegerDefault0Adapter())
    .registerTypeAdapter(Double.class, new DoubleDefault0Adapter())
    .registerTypeAdapter(double.class, new DoubleDefault0Adapter())
    .registerTypeAdapter(Float.class, new FloatDefault0Adapter())
    .registerTypeAdapter(float.class, new FloatDefault0Adapter())
    .registerTypeAdapter(Long.class, new LongDefault0Adapter())
    .registerTypeAdapter(long.class, new LongDefault0Adapter())
    //.registerTypeAdapter(String.class, new StringDefaultAdapter())
    .registerTypeAdapter(String.class, new StringNullAdapter())
    .registerTypeAdapter(BaseResult.class, new JsonFormatAdapter(type))
    .create();

处理第一种数据

Type type = new TypeToken<BaseResult<Person>>() {
    
    
}.getType();
BaseResult<Person> result = gson.fromJson(json, type);
System.out.println(result);
BaseResult{
    
    code=0, message='success', data=Person{
    
    name='', age=0, sex=false, id='1231231231'}}

处理第二种数据

Type type = new TypeToken<BaseResult<ArrayList<Person>>>() {
    
    
}.getType();
BaseResult<ArrayList<Person>> result = gson.fromJson(json, type);
System.out.println(result);
BaseResult{code=0, message='success', data=[Person{name='', age=0, sex=false, id='1231231231'}, Person{name='小芳22', age=228, sex=true, id='1231231231'}]}

处理第三种数据

BaseResult{code=1, message='success', data=null}

猜你喜欢

转载自blog.csdn.net/qq_14876133/article/details/114240610