1. GSON の概要
JSON (JavaScript Object Notation) は軽量のデータ交換形式です。人間にとって読み書きしやすい。機械による解析と生成も簡単です。
Gson は、Java オブジェクトと JSON データ間のマッピングのために Google が提供する Java クラス ライブラリです。JSON 文字列を Java オブジェクトに変換する (逆シリアル化)、またはその逆 (シリアル化) を行うことができます。
使い方は簡単です:
まず、GSON クラス ライブラリの jar パッケージを独自のプロジェクトにインポートする必要があります。
GSON のgithubアドレス: https://github.com/google/gson/
GSON ダウンロード アドレス: https://search.maven.org/artifact/com.google.code.gson/gson/2.8.6/jar
Android では GSON が導入されています。
implementation 'com.google.code.gson:gson:2.8.6'
2. JavaBeanのシリアル化/逆シリアル化
- gsonオブジェクトを使用したJavaBeanのシリアル化
- gsonオブジェクトを使用したJavaBeanのシリアル化
2.1 単一の JavaBean
ユーザーBeanクラスを作成する
class User {
private String firstName;
private String lastName;
private Student student;
public User() {};
public User(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public User(String firstName, String lastName,Student student) {
this.firstName = firstName;
this.lastName = lastName;
this.student = student;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
....
}
public void testUserBean(){
User user = new User("name","name2");
Gson gson = new Gson(); //创建GSON对象
String userJson = gson.toJson(user); //序列化
System.out.println("序列化:" + userJson);
User user = gson.fromJson(userJson, User.class); //反序列化
System.out.println("反序列化:" + user);
}
2.2 入れ子になったクラス
Userを元に生徒(名前、年齢)を作成し、属性を追加(追加)
@Test
public void nestedUserBean(){
User user1 = new User("zhangsan","lisi");
Gson gson = new Gson(); //创建GSON对象
Student student = new Student("liming", 18);
user1.setJob(student);
String userJson = gson.toJson(user1); //序列化
System.out.println("序列化:" + userJson);
User user2 = gson.fromJson(userJson, User.class); //反序列化
System.out.println("反序列化:" + user2);
}
3. 配列とリストのシリアル化/逆シリアル化
3.1 配列のシリアル化/逆シリアル化
通常のオブジェクトと同様に、配列型オブジェクトも toJson/fromJson を使用してシリアル化および逆シリアル化できます。
public void test(){
User[] users1 = new User[3];
users1[0] = new User("zhangsan","lisi");
users1[1] = new User("lisi","wangwu");
Gson gson = new Gson(); //创建GSON对象
String userJson = gson.toJson(users1); //序列化
System.out.println("序列化:" + userJson);
User[] users2 = gson.fromJson(userJson, User[].class); //反序列化
System.out.println("反序列化0:" + users2[0].getFirstName());
.......
}
3.2 リストコレクションのシリアル化/逆シリアル化
List コレクション型のオブジェクトを逆シリアル化する場合、Java は疑似ジェネリックであるため、ジェネリック消去では List<User> に逆シリアル化できなくなり、逆シリアル化を完了するには TypeToken を使用する必要があることに注意してください。
public void testList(){
List<User> userList1 = new ArrayList<>();
userList1.add(new User("zhangsan","lisi"));
userList1.add(new User("lisi","wangwu"));
Gson gson = new Gson(); //创建GSON对象
String userJson = gson.toJson(userList1); //序列化
System.out.println("序列化:" + userJson);
Type type = new TypeToken<List<User>>() {}.getType(); //泛型类型,import com.google.gson.reflect.TypeToken;
List<User> userList2 = gson.fromJson(userJson, type); //反序列化
System.out.println("反序列化0:" + userList2.get(0).getFirstName());
System.out.println("反序列化1:" + userList2.get(1));
}
4. SetとMapのシリアル化/逆シリアル化
Set コレクション型オブジェクトと Map コレクション型オブジェクトは、逆シリアル化する場合は List と同じであり、逆シリアル化を完了するには TypeToken を使用する必要があります。
4.1 Setコレクションのシリアル化/逆シリアル化
public void testSet(){
Set<User> userSet1 = new HashSet<>();
userSet1.add(new User("zhangsan","lisi"));
userSet1.add(new User("lisi","wangwu"));
Gson gson = new Gson(); //创建GSON对象
String userJson = gson.toJson(userSet1); //序列化
System.out.println("序列化:" + userJson);
Type type = new TypeToken<Set<User>>() {
}.getType(); //泛型类型,import com.google.gson.reflect.TypeToken;
Set<User> userSet2 = gson.fromJson(userJson, type); //反序列化
for (User user:userSet2) {
System.out.println(user);
}
}
4.2 マップコレクションのシリアル化/逆シリアル化
public void testMap(){
Map<String,User> userMap1 = new HashMap<>();
userMap1.put("1", new User("zhangsan","lisi"));
userMap1.put("2",new User("lisi","wangwu"));
userMap1.put("3", null);
userMap1.put(null, null);
Gson gson = new Gson(); //创建GSON对象
String userJson = gson.toJson(userMap1); //序列化
System.out.println("序列化:" + userJson);
Type type = new TypeToken<Map<String, User>>() {
}.getType(); //泛型类型,import com.google.gson.reflect.TypeToken;
Map<String,User> userMap2 = gson.fromJson(userJson, type); //反序列化
for (Object user:userMap2.entrySet()) {
System.out.println(user);
}
}
5. 変数値がnullの場合のシリアライズ/デシリアライズ
変数の値が NULL の場合、GSON のデフォルトの処理に従って、このセクションは無視されます。
6. シリアル化/逆シリアル化を制御する変数名
JSON 文字列フィールド名で変数名をキーとして使用しないようにする場合、たとえば、SON 文字列内のキーが Java のキーワードとして存在する場合、 @SerializedName アノテーションを使用してキーの名前付けを制御できます。 JSONフィールド。
特定のフィールド構成のシリアル化と逆シリアル化に GSON が参加するかどうかを指定する場合は、 @Expose アノテーションを使用して制御し、GsonBuilder を使用して Gson オブジェクトを作成できます。
さらに、transient キーワードで変更された変数を直接使用すると、変数がシリアル化/逆シリアル化に参加するのを防ぐこともできます。
package com.atguigu.test;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
class User2 {
@Expose
private String username;
@Expose
private String pd;
@Expose
private int age;
@Expose
private boolean isStudent;
@Expose
private Student student;
//serialize:是否参与序列化,deserialize是否参与反序列化
@Expose(serialize = false,deserialize = false)
private int test1;
private transient int test2;
//使用SerializedName注解可以实现以class作为字段名
@Expose
@SerializedName("class")
private int clazz;
public User2() {
}
public User2(String username, String password, int age, boolean isStudent) {
this.username = username;
this.pd= password;
this.age = age;
this.isStudent = isStudent;
}
public User2(String username, String password, int age, boolean isStudent, Student student, int test1, int test2, int clazz) {
this.username = username;
this.pd= password;
this.age = age;
this.isStudent = isStudent;
this.student = student;
this.test1 = test1;
this.test2 = test2;
this.clazz = clazz;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return pd;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
public void setPassword(String password) {
this.pd= password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isStudent() {
return isStudent;
}
public void setStudent(boolean student) {
isStudent = student;
}
public int getTest1() {
return test1;
}
public void setTest1(int test1) {
this.test1 = test1;
}
public int getTest2() {
return test2;
}
public void setTest2(int test2) {
this.test2 = test2;
}
public int getClazz() {
return clazz;
}
public void setClazz(int clazz) {
this.clazz = clazz;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", pd='" + pd + '\'' +
", age=" + age +
", isStudent=" + isStudent +
", student=" + student +
", test1=" + test1 +
", test2=" + test2 +
", clazz=" + clazz +
'}';
}
}
テスト:
public void tests(){
User2 user1 = new User2("zhangsan","123",18,false);
user1.setTest1(1);
user1.setTest2(2);
user1.setClazz(3);
// Gson gson = new Gson(); //创建GSON对象
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); //让@Expose注解生效
String userJson = gson.toJson(user1); //序列化
System.out.println("序列化:" + userJson);
User2 user2 = gson.fromJson(userJson, User2.class); //反序列化
System.out.println("反序列化:" + user2);
}
参考:
Java_5239ZM のブログ - CSDN blog_gson java での GSON の使用
https://www.jianshu.com/p/cc159151587f
Java は GSON を使用して JSON を解析します - IDEA が jar パッケージを導入しました。method_Archie_java のブログ - CSDN blog_gson jar