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

简介:使用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() {}.getType());
        System.out.println(p2);

        System.out.println("-----------------------");

        List list = new ArrayList<>();
        list.add(p1);
        list.add(p2);
        list.add(person);
        String listToJson = toJson(list);
        ArrayList personList = readValuesAsArrayList(listToJson, new TypeToken>() {}.getType());
        System.out.println(personList);

    }

    /**
     * 将Json串反序列化为ArrayList集合
     * @param json
     * @param t
     * @param 
     * @return
     */
    public static  ArrayList 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 
     * @return
     */
    public static  T fromJson(String json, Class clazz){
        try {
            return gson.fromJson(json, clazz);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 将Json串反序列化成对象
     * @param json
     * @param type
     * @param 
     * @return
     */
    public static  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 +
                    '}';
        }
    }

}

你可能感兴趣的:(工具类,my_java_tools)