原文地址 http://www.jianshu.com/p/e740196225a4
JSON (官网) 是一种文本形式的数据交换格式,它比XML更轻量、比二进制容易阅读和编写,调式也更加方便。其重要性不言而喻。解析和生成的方式很多,Java中最常用的类库有:JSON-Java、Gson、Jackson、FastJson等。
@SerializedName注解的作用:定义属性序列化后的名称
基于@Expose注解
@Expose提供了两个属性,且都有默认值,开发者可以根据需要设置不同的值。
![](http://upload-images.jianshu.io/upload_images/1724103-c98c4767a0f42b18.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
@Expose
@Expose 注解从名字上就可以看出是暴露的意思,所以该注解是用于对处暴露字段的。可是我们以前用Gson的时候也没有@Expose 注解还是不正确的序列化为JSON了么?是的,所以该注解在使用new Gson()
时是不会发生作用。毕竟最常用的API要最简单,所以该注解必须和GsonBuilder
配合使用。
使用方法: 简单说来就是需要导出的字段上加上@Expose 注解,不导出的字段不加。注意是不导出的不加。
@Expose //
@Expose(deserialize = true,serialize = true) //序列化和反序列化都都生效
@Expose(deserialize = true,serialize = false) //反序列化时生效
@Expose(deserialize = false,serialize = true) //序列化时生效
@Expose(deserialize = false,serialize = false) // 和不写一样
注:根据上面的图片可以得出,所有值为true
的属性都是可以不写的。
拿上面的例子来说就是
public class Category {
@Expose public int id;
@Expose public String name;
@Expose public List<Category> children;
//不需要序列化,所以不加 @Expose 注解,
//等价于 @Expose(deserialize = false,serialize = false)
public Category parent;
}
在使用Gson时也不能只是简单的new Gson()
了。
Gson gson = new GsonBuilder()
.excludeFieldsWithoutExposeAnnotation()
.create();
gson.toJson(category);
另外想要不序列化某个属性,也可以使用transient。private transient String name;