Gson学习-2

2019-09-19  本文已影响0人  盼旺

原文地址:https://www.jianshu.com/p/e740196225a4

主要内容

1.Gson的流式反序列化
2.Gson的流式序列化
3.使用GsonBuilder导出null值、格式化输出、日期时间及其它小功能

一、Gson的流式反序列化

json常用的5个方法

Gson.toJson(Object);
Gson.fromJson(Reader,Class);
Gson.fromJson(String,Class);
Gson.fromJson(Reader,Type);
Gson.fromJson(String,Type);

利用上面的下面4种反序列化方法就是自动方式
下面学习手动方式走一遍
使用stream包下的JsonReader类来手动实现反序列化

    public static void main(String[] args) {

        String str = "{\"name\":\"星星\",\"age\":22,\"email\":\"5456s45@qq.com\"}";
        User user = new User();
        JsonReader reader = new JsonReader(new StringReader(str));
        try {
            reader.beginObject();
            while(reader.hasNext()){
                String s = reader.nextName();
                switch (s) {
                    case "name":
                        user.name = reader.nextString();//自动转换
                        break;
                    case "age":
                        user.age = reader.nextInt(); //自动转换
                        break;
                    case "email":
                        user.email = reader.nextString();//自动转换
                        break;
                }
            }
            reader.endObject();
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(user.toString());
//        User{name='星星', age=22, email='5456s45@qq.com'}
    }

其实自动方式最终都是通过JsonReader来实现的,如果第一个参数是String类型,那么Gson会创建一个StringReader转换成流操作。

二、Gson的流式序列化

自动方式

Gson.toJson方法列表

PrintStream(System.out)StringBuilderStringBufferWriter都实现了Appendable接口。
举例
        Gson gson = new Gson();
        User user = new User("星星",22,"14515465sw@qq.com");
        gson.toJson(user,System.out); // 写到控制台
//        {"name":"星星","age":22,"email":"14515465sw@qq.com"}

手动方式

        Gson gson = new Gson();
//        通过传入一个输出流对象生成JsonWriter类对象
        JsonWriter writer = new JsonWriter(new OutputStreamWriter(System.out));
        try {
            writer.beginObject() // throws IOException
                    .name("name").value("星星")
                    .name("age").value(22)
                    .name("email").nullValue() //演示null
                    .endObject(); // throws IOException
            writer.flush(); // 确保所有缓存数据写入底层Writer并刷新(flush)这个实例对象 throws IOException
        } catch (IOException e) {
            e.printStackTrace();
        }
//{"name":"星星","age":22,"email":null}

除了beginObjectendObject还有beginArrayendArray,两者可以相互嵌套,注意配对即可。beginArray后不可以调用name方法,同样beginObject后在调用value之前必须要调用name方法。
beginArray开始一个新的数组编码。每次调用这个方法必须调用一个endArray()进行配对。
beginObject开始一个新的对象编码。每次调用这个方法必须调用一个endObject ()进行配对。

三、 使用GsonBuilder导出null值、格式化输出、日期时间

一般情况下Gson类提供的 API已经能满足大部分的使用场景,但我们需要更多更特殊、更强大的功能时,这时候就引入一个新的类 GsonBuilder
GsonBuilder是用于构建Gson实例的一个类,要想改变Gson默认的设置必须使用该类配置Gson
GsonBuilder用法

Gson gson = new GsonBuilder()
               //各种配置
               .create(); //生成配置好的Gson

1.Gson在默认情况下是不动导出值null的键的,如:

Gson gson = new Gson();
User user = new User("星星",22);
System.out.println(gson.toJson(user)); //{"name":"星星","age":22}

可以看出,email字段是没有在json中出现的,当我们在调试是、需要导出完整的json串时或API中要求没有值必须用Null时,就会比较有用。

        Gson gson = new GsonBuilder()
                .serializeNulls()
                .create();
        User user = new User("星星",22);
        System.out.println(gson.toJson(user));
//        {"name":"星星","age":22,"email":null}

2.格式化输出、日期时间及其它*
Date序列化与反序列化

        Gson gson = new GsonBuilder().setDateFormat("YYYY-MM-dd HH:mm:ss").create();
        Model m = new Model();
        Date d = new Date();
        System.out.println(new Date()); //Thu Sep 19 09:57:05 CST 2019
        m.setDate(d);
        String str = gson.toJson(m);
        System.out.println(str);  //{"date":"2019-09-19 09:57:05"}
//        将Date对象A序列化,然后把得到的日期字符串进行反序列化得到对象B,此时B和A并不相等!!这是为什么?
//        原因是JSON在将日期字符串反序列化时,默认将毫秒数进行割断,所以输出的毫秒数最后是3个0
        Model nowm = gson.fromJson(str, Model.class);
        System.out.println(m.getDate().getTime());//1568858955523
        System.out.println(nowm.getDate().getTime());//1546135755000

如何让序列化和反序列的date都一样呢?
总结

Gson gson = new GsonBuilder()
        //序列化null
        .serializeNulls()
        // 设置日期时间格式,另有2个重载方法
        // 在序列化和反序化时均生效
        .setDateFormat("yyyy-MM-dd")
        // 禁用此序列化内部类
        .disableInnerClassSerialization()
        //生成不可执行的Json(多了 )]}' 这4个字符)
        .generateNonExecutableJson()
        //禁止转义html标签
        .disableHtmlEscaping()
        //格式化输出
        .setPrettyPrinting()
        .create();
上一篇 下一篇

猜你喜欢

热点阅读