自定义类型适配器的Gson工具类

来源:互联网 发布:adobe pdf 电脑软件 编辑:程序博客网 时间:2024/06/05 23:08

在android开发以及javaEE的开发过程中,我们需要解析json,下面我为大家提供一个已经封装好的工具类,在使用过程中,完全不需要再对gson作处理。一行代码即可以实现转换

public final  class JsonUtil {    private JsonUtil(){}    /**     * 对象转换成json字符串     * @param obj     * @return     */    public static String toJson(Object obj) {        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(Long.class, new LongDefault0Adapter())                .registerTypeAdapter(long.class, new LongDefault0Adapter())                .create();        return gson.toJson(obj);    }    /**     * json字符串转成对象     * @param str     * @param type     * @return     */    public static <T> T fromJson(String str, Type type) {        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(Long.class, new LongDefault0Adapter())                .registerTypeAdapter(long.class, new LongDefault0Adapter())                .create();        return gson.fromJson(str, type);    }    /**     * json字符串转成对象     * @param str     * @param type     * @return     */    public static <T> T fromJson(String str, Class<T> type) {        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(Long.class, new LongDefault0Adapter())                .registerTypeAdapter(long.class, new LongDefault0Adapter())                .create();        return gson.fromJson(str, type);    }}

在这里,我们使用了IntegerDefault0Adapter,DoubleDefault0Adapter,LongDefault0Adapter自定义类型适配器,用来解决解析过程中的类型转换异常

IntegerDefault0Adapter.java

public 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")) {//定义为int类型,如果后台返回""或者null,则返回0                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);    }}

DoubleDefault0Adapter.java

public 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")) {//定义为double类型,如果后台返回""或者null,则返回0.00                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);    }}

LongDefault0Adapter.java

public 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")) {//定义为long类型,如果后台返回""或者null,则返回0                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);    }}
原创粉丝点击