JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于JavaScript的一个子集,易于人的编写和阅读,也易于机器解析。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。
因为json有2种类型:
所以针对这两种类型,来展开对json数据的操作。GSON在解析json的时候,大体上有2种类型,一种是直接在内存中生成object或array,通过手工指定key来获取值;另一种是借助javabean来进行映射获取值。我们主要采用第二种使用javabean来进行映射获取。
1.对json进行反序列化得到java对象
通用示例
Gson gson = new Gson();
BeanType bean = gson.fronJson(jsonData, BeanType.class);
具体例子
Java实体类
package entity;
public class User {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
利用User类来解析json
package jsontest;
import com.google.gson.Gson;
import entity.User;
public class JsonToObjectDemo {
public static void main(String[] args){
Gson gson = new Gson();
String jsonString = "{\"username\":\"tom\",\"password\":\"123456\"}";
System.out.println(jsonString);
User tom = gson.fromJson(jsonString,User.class);
System.out.println(tom.toString());
}
}
1.1如果字段名并不一致怎么办?
如果前端传过来的json 数据的key和我们java类的字段不一致,就需要我们在java类中手工进行指定。
比如将username改成userName,这个时候我们可以使用@SerializedName("userName")
注解来实现。
public class User {
@SerializedName("userName")
private String username;
private String password;
}
1.2如果不想某些字段不参加序列化后者反序列化
如果想要让java类的某些字段不参加序列化或反序列化,可以使用@Expose()
注解来实现
@Expose
@SerializedName("userName")
private String username;
@Expose(serialize = false,deserialize = false)
private String password;
利用Java数组来解析json数组
对于数组形式的json数据,我们还可以反序列化为List类型的数组。因为List进行增删改都比较方便。
package jsontest;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import entity.User;
import java.lang.reflect.Type;
import java.util.List;
public class JsonArrayToList {
public static void main(String[] args){
String jsonString = "[\n" +
" {\n" +
" \"username\": \"tom\",\n" +
" \"password\": \"123456\"\n" +
" },\n" +
" {\n" +
" \"username\": \"tony\",\n" +
" \"password\": \"1234567\"\n" +
" }\n" +
"]";
Gson gson = new Gson();
Type type = new TypeToken<List<User>>(){
}.getType();
List<User> userList = gson.fromJson(jsonString,type);
}
}
2.由java对象序列化为JSON
我们可以直接把java对象给序列化为json数据。对于未设置的属性,会采取默认值;但是如果默认是null的话,该属性就不会被序列化。
package jsontest;
import com.google.gson.Gson;
import entity.User;
import java.util.ArrayList;
import java.util.List;
public class ListToJsonDemo {
public static void main(String[] args){
User tom = new User();
User tony = new User();
tom.setUsername("tom");
tom.setPassword("123456");
tony.setUsername("tony");
tony.setPassword("1234567");
List<User> userList = new ArrayList<>();
userList.add(tom);
userList.add(tony);
Gson gson = new Gson();
String jsonString = gson.toJson(userList);
System.out.println(jsonString);
}
}