Gson之常用注解

@SerializedName
前面Java类中的属性和Json中的key都是一样的,但是总会有一些情况下,你想指定不同的名字 
我们还以之前的Student类为例: 
如果我想把name属性序列化到Json中为nickName怎么办?

public class Student {
    @SerializedName("nickName")
    public String name;
    public int age;
    public boolean isLOLPlayer;
}
1
2
3
4
5
6
只需要加一个@SerializedName(“nickName”)的注解,这就相当于建立了一种关系Java属性name 对应 Json中 nickName 
还是之前序列化的代码,输出如下

{"nickName":"shilang","age":15,"isLOLPlayer":false}
1
反序列化也是和之前一样。

接下来我们看一下注解的定义如下:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD})
public @interface SerializedName {
  String value();
  String[] alternate() default {};
}
1
2
3
4
5
6
7
这个注解有两个属性,发现其中alternate是字符串数组类型,而且已经有默认值了,也就是只有value一个属性没有默认值,因此我们上面指定的@SerializedName(“nickName”)等价于@SerializedName(value=”nickName”)

那alternate有什么作用呢? 
value 指定的名字在序列化和反序列化过程中都起作用,比如下面的情况

public class Student {

    @SerializedName(value = "nickName",alternate = {"stuName","studentName"})
    public String name;
    public int age;
    public boolean isLOLPlayer;
}
1
2
3
4
5
6
7
我们通过Java类序列化生成的Json中键值一定是nickName

alternate 只有在反序列化的时候才起作用,比如下面的Json

{
    "age": 15,
    "isLOLPlayer": false,
    "stuName": "shilang"
}
1
2
3
4
5
也可以向我们期望的那样反序列化为Student对象,其中name为shilang

这时候你可能要问那么Json中多个键都出现的情况下,怎么办呢?就像下面这样

{
    "age": 15,
    "isLOLPlayer": false,
    "nickName": "lin",
    "stuName": "shilang"
}
1
2
3
4
5
6
额,哪个键在后面就用哪个,上面的情况name值为shilang 
关于@SerializedName 的用法就以上这些啦

@Expose
看注解的名字我们知道是“暴露,揭露”的意思,其实它的应用场景就是你只想序列化或者反序列化部分字段。下面我们来看一下注解的定义

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Expose {
  public boolean serialize() default true;
  public boolean deserialize() default true;
}
1
2
3
4
5
6
7
@Expose有两个属性serialize和deserialize,默认值都为true,很明显就是控制是否序列化或者反序列化,比如

public class Student {


    @Expose//序列化也反序列化
    public int id;
    @Expose(deserialize = false)//只序列化
    public String name;
    @Expose(serialize = false)//只反序列化
    public int age;
    @Expose(serialize = false,deserialize = false)//既不序列化也不反序列化
    public boolean isLOLPlayer;

    public String sex;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
上面的这个Java类在序列化的时候只会序列化id和name,在反序列化的时候只会反序列化id和age,另外你也注意到不加注解和@Expose(serialize = false,deserialize = false)的情况在表现层面上是一样的,就像sex和isLOLPlayer。 
还有非常重要的一点是你通过new Gson()获得的Gson实例默认不会去处理@Expose注解,需要通过GsonBuilder的方式,调用排除没有@Expose注解的字段的方法

 Student student=new Student(1,"shilang",15,false,"男");
 Gson gson=new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
 String stuJSON=gson.toJson(student);
1
2
3

————————————————
版权声明:本文为CSDN博主「pngfi」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/pngfi/article/details/62057628

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值