一.JSON概念部分
1.json概念
定义:JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。可用于数据标记,存储,传输。
2.json解析示意图
json的解析一般有三种方式,即Gson,Jackson,Fastjson
3.json语法格式
总体来说就是键值对
对象
举例:
{
"name":"ljh",
"age":21
}
如果是数组,就加个中括号[]
举例:array数组里面是两个对象
"array":[
{
"name":"ljh",
"age":21
},
{
"name":"ljh1",
"age":22
}
]
如果符合这些格式,就说明是格式良好的json,方便使用gson等来解析。
二.Gson
1.Gson相关的注解
①@SerializedName
:里面的参数作为json的key
class MyClass {
@SerializedName("name") //a => name
String a;
@SerializedName(value = "name1", alternate = {
"name2", "name3"})
String b;
String c;
public MyClass(String a, String b, String c) {
this.a = a;
this.b = b;
this.c = c;
}
public static void test(){
MyClass target = new MyClass("v1", "v2", "v3");
Gson gson = new Gson();
String json = gson.toJson(target);
System.out.println(json);
/**
* {"name":"v1","name1":"v2","c":"v3"}
*/
}
}
②@Expose
:过滤掉是否需要序列化/反序列化的属性
class User0 {
@Expose
private String firstName;//默认参与序列化,也参与反序列化
@Expose(serialize = false)
private String lastName;//不参与序列化,但参与反序列化
@Expose(serialize = false, deserialize = true)
private String emailAddress; //不参与序列化,但参与反序列化(默认)
@Expose(serialize = true,deserialize = false)
private String password;//参与序列化,但不参与反序列化
public User0(String firstName, String lastName, String emailAddress, String password) {
this.firstName = firstName;
this.lastName = lastName;
this.emailAddress = emailAddress;
this.password = password;
}
@Override
public String toString() {
return "User0{" +
"firstName='" + firstName + '\'' +
", lastName='" + lastName + '\'' +
", emailAddress='" + emailAddress + '\'' +
", password='" + password + '\'' +
'}';
}
public static void test(){
/**
* 如果要让expose注解发挥作用,必须
* new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
* 这样来构建Gson对象
*/
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
String json = gson.toJson(new User0("jinhao","liu","email","111"));
System.out.println(json);
/**
* {"firstName":"jinhao","password":"111"}
*/
User0 user0 = gson.fromJson(json,User0.class);
System.out.println(user0);
/**
* User0{firstName='jinhao', lastName='null', emailAddress='null', password='null'}
* 需要注意的是password参与序列化,所以json中可以打印password的值。但是他不参与
* 反序列化,所以解析的时候password赋默认值null
*/
}
}
可以看下@Expose
的源码。
可以发现他赋的默认值都为true
③@since
和@until
版本控制。当使用since
注解的时候,意为当版本大于等于since
注解的参数的时候,被since
注解修饰的属性才会参与序列化/反序列化,否则忽略
class User1 {
private String firstName;
private String lastName;
@Since