Json工具类--使用Gson实现了Json的序列化和反序列化

来源:互联网 发布:学历网络教育费用 编辑:程序博客网 时间:2024/06/05 04:08

简介:使用Gson实现了Json的序列化和反序列化!

1.工具类代码:

import com.google.gson.Gson;import com.google.gson.GsonBuilder;import com.google.gson.annotations.Expose;import com.google.gson.annotations.SerializedName;import com.google.gson.reflect.TypeToken;import java.io.Serializable;import java.lang.reflect.Type;import java.util.ArrayList;import java.util.Date;import java.util.List;/** * Created by admin on 2017/9/28. * 使用Gson实现了Json的序列化和反序列化 */public class TestGson {    private static final Gson GSON = new Gson();    private static final Gson gson = new GsonBuilder()            //序列化null,为null的字段也打印出来            .serializeNulls()            // 设置日期时间格式,另有2个重载方法            // 在序列化和反序化时均生效            .setDateFormat("yyyy-MM-dd HH:mm:ss")            // 禁此序列化内部类            //.disableInnerClassSerialization()            //生成不可执行的Json(多了 )]}' 这4个字符)            //.generateNonExecutableJson()            //禁止转义html标签            //.disableHtmlEscaping()            //格式化输出            //.setPrettyPrinting()            //配合@Expose注解使用,用于设置该字段是否需要序列化和反序列化            //.excludeFieldsWithoutExposeAnnotation()            .create();    public static void main(String[] args) {        Person person = new Person();        person.setName("abc");        person.setAge(18);        person.setBirthday(new Date());        String s1 = toJson(person);        System.out.println(s1);        System.out.println("-----------------------");        String toJson = toJson(person);        System.out.println(toJson);        System.out.println("-----------------------");        Person p1 = fromJson(toJson, Person.class);        System.out.println(p1);        System.out.println("-----------------------");        Person p2 = fromJson(toJson, new TypeToken<Person>() {}.getType());        System.out.println(p2);        System.out.println("-----------------------");        List<Person> list = new ArrayList<>();        list.add(p1);        list.add(p2);        list.add(person);        String listToJson = toJson(list);        ArrayList<Person> personList = readValuesAsArrayList(listToJson, new TypeToken<List<Person>>() {}.getType());        System.out.println(personList);    }    /**     * 将Json串反序列化为ArrayList集合     * @param json     * @param t     * @param <T>     * @return     */    public static <T> ArrayList<T> readValuesAsArrayList(String json, Type t) {        try {            return gson.fromJson(json, t);        } catch (Exception e) {            e.printStackTrace();        }        return null;    }    /**     * 将对象序列化为Json串     * @param obj     * @return     */    public static String toJson(Object obj){        try {            return gson.toJson(obj);        } catch (Exception e) {            e.printStackTrace();        }        return null;    }    /**     * 将Json串反序列化成对象     * @param json     * @param clazz     * @param <T>     * @return     */    public static <T> T fromJson(String json, Class<T> clazz){        try {            return gson.fromJson(json, clazz);        } catch (Exception e) {            e.printStackTrace();        }        return null;    }    /**     * 将Json串反序列化成对象     * @param json     * @param type     * @param <T>     * @return     */    public static <T> T fromJson(String json, Type type){        try {            return gson.fromJson(json, type);        } catch (Exception e) {            e.printStackTrace();        }        return null;    }    /**     * 测试使用实体类Person     */    public static class Person implements Serializable {        @Expose(deserialize = true,serialize = true)        private String name;        /**         * 用于设置该字段是否需要序列化和反序列化。         * @Expose(deserialize = true,serialize = true) //序列化和反序列化都生效         * @Expose(deserialize = true,serialize = false) //反序列化时生效         * @Expose(deserialize = false,serialize = true) //序列化时生效         * @Expose(deserialize = false,serialize = false) //序列化和反序列化都不生效,即默认。         * 注意:         *      必须设置Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();         *      否则注解@Expose不生效。         */        @Expose(deserialize = true,serialize = true)        private Integer age;        /**         * SerializedName的value属性,用于将birthday字段序列化时的key值         * alternate属性是一个数组,当反序列化时,可以识别任意一个名称与该属性对应         */        @SerializedName(value = "Birthday", alternate = {"birthday", "birthdate"})        @Expose(deserialize = true,serialize = true)        private Date birthday;        public String getName() {            return name;        }        public void setName(String name) {            this.name = name;        }        public Integer getAge() {            return age;        }        public void setAge(Integer age) {            this.age = age;        }        public Date getBirthday() {            return birthday;        }        public void setBirthday(Date birthday) {            this.birthday = birthday;        }        @Override        public String toString() {            return "Person{" +                    "name='" + name + '\'' +                    ", age=" + age +                    ", birthday=" + birthday +                    '}';        }    }}