Gson使用

JSON是一种文本形式的数据交换格式,它比XML更轻量、比二进制容易阅读和编写,调式也更加方便。其重要性不言而喻。解析和生成的方式很多,Java中最常用的类库有:JSON-Java、Gson、Jackson、FastJson等.
这里简单介绍下Google开源的Gson。

Maven依赖:

<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.5</version>
</dependency>

gradle依赖:

// https://mvnrepository.com/artifact/com.google.code.gson/gson
compile group: 'com.google.code.gson', name: 'gson', version: '2.8.5'

Gson简单使用

json有两个基础方法
- toJson() 将对象转化为json字符串
- fromJson() 将json字符串转化为特定类型

// 使用new方法
Gson gson = new Gson();

// toJson 将bean对象转换为json字符串
String jsonStr = gson.toJson(user, User.class);

// 序列化List
String jsonStr2 = gson.toJson(list);

// fromJson 将json字符串转为bean对象
Student user= gson.fromJson(jsonStr, User.class);

// 反序列化成List时需要使用到TypeToken getType()
List<User> retList = gson.fromJson(jsonStr2,new TypeToken<List<User>>(){}.getType());

// 反序列化Hashmap
HashMap<String, Object> map = gson.fromJson(jsonStr,new TypeToken<HashMap<String, Object>>(){}.getType());

GsonBuilder

  • excludeFieldsWithoutExposeAnnotation() //不导出实体中没有用@Expose注解的属性
  • enableComplexMapKeySerialization() //支持Map的key为复杂对象的形式
  • serializeNulls() // 系列化结果包含空字段
  • setDateFormat(“yyyy-MM-dd HH:mm:ss:SSS”)//时间转化为特定格式
  • setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)//会把字段首字母大写,注:对于实体上使用了@SerializedName注解的不会生效
  • setPrettyPrinting() //对json结果格式化
  • setVersion(1.0) //有的字段不是一开始就有的,会随着版本的升级添加进来,那么在进行序列化和返序列化的时候就会根据版本号来选择是否要序列化.
    //@Since(版本号)能完美地实现这个功能.还的字段可能,随着版本的升级而删除,那么
    //@Until(版本号)也能实现这个功能,GsonBuilder.setVersion(double)方法需要调用.

Gson注解

//Expose注解用来指定字段需不需要序列化,serialize为false代表不序列化, deserialize则代表反序列化
//默认情况下@Expose注解是不起作用的,需要用GsonBuilder创建Gson的时候调用了GsonBuilder.excludeFieldsWithoutExposeAnnotation()方法:
@Expose(serialize = true, deserialize = false)

//使用SerializedName注解自定义序列化字段名称,直接用Gson就可以,不用GsonBuilder生成对象
@SerializedName("name")

//使用Since注解表示哪些字段是哪个版本的,@Since(1.0)代表1.0版本,应用版本比它高或同等时会被序列化,反之不会,在GsonBuilder中使用setVersion(1.0)即可使用
@Since(1.0) 或者 @Until(1.0)

Gson简单工具类

Gson实例是线程安全的,因此,可以在多个线程里重复使用Gson实例,从而降低开销。
既然多线程共用同实例,那么编写gson工具类就是必要的。

简单实现如下,仅包含反序列化和过滤或者不过滤非空字段功能。

/**
 * description:
 * gson为线程安全的类,所以可以使用工具类来减少对象的实例化
 *
 * @author wkGui
 */
public class GsonUtil {
    private static Gson filterNullGson;
    private static Gson nullableGson;
    static {
        nullableGson = new GsonBuilder()
                .enableComplexMapKeySerialization()
                .serializeNulls()
                .setDateFormat("yyyy-MM-dd HH:mm:ss:SSS")
                .create();
        filterNullGson = new GsonBuilder()
                .enableComplexMapKeySerialization()
                .setDateFormat("yyyy-MM-dd HH:mm:ss:SSS")
                .create();
    }

    protected GsonUtil() {
    }

    /**
     * 根据对象返回json   不过滤空值字段
     */
    public static String toJsonWtihNullField(Object obj){
        return nullableGson.toJson(obj);
    }

    /**
     * 根据对象返回json  过滤空值字段
     */
    public static String toJsonFilterNullField(Object obj){
        return filterNullGson.toJson(obj);
    }

    /**
     * 将json转化为对应的实体对象
     * new TypeToken<HashMap<String, Object>>(){}.getType()
     */
    public static <T>  T fromJson(String json, Type type){
        return nullableGson.fromJson(json, type);
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值