Java は GSON を使用して JSON を解析します

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

おすすめ

転載: blog.csdn.net/gqg_guan/article/details/126663046