Java-->Gson序列化及反序列化

--> 首先导入jar包,并添加到Build Path

--> 需要User类:有属性、构造方法和setter、getter方法。

--> Test 测试类:

package com.dragon.java.gson;

import java.util.Arrays;
import java.util.List;

import com.dragon.java.json.User;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

/*
 Gson: Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库。
 --> 可以将一个 JSON 字符串转成一个 Java 对象,或者反过来。
 */
public class Test {
    public static void main(String[] args) {
        String json = "{"name": "李四", "age": 30}";
        String jsons = "[{"name": "李四", "age": 40},{"name": "张三", "age": 20},{"name": "王五", "age": 30}]";
        String jsonss = "{"status":"ok", "data": [{"name": "李四", "age": 30},{"name": "张三", "age": 20},{"name": "王五", "age": 30}] }";

        gsonFirst(json);
        System.out.println("----------------");
        gsonTypeToken(jsons);
        System.out.println("----------------");
        gsonFinal(jsonss);
        System.out.println("----------------");
        serializtion();
        System.out.println("----------------");
    }

    /**
     * 序列化
     */
    private static void serializtion() {
        // User user = new User("张三", 20);
        Gson gson = new Gson();
        // String jsonString = gson.toJson(user);

        User[] users = { new User("张三", 20), new User("李四", 30),
                new User("王五", 40) };
        // 把数组或可变参数转换成集合。这个集合是不可变的集合,不能添加或排除元素
        List<User> userList = Arrays.asList(users);
        // 可以将集合变为可操作的集合 // new ArrayList<>().addAll(userlist);
        String json = gson.toJson(users);
        System.out.println(json);
        String json2 = gson.toJson(userList);
        System.out.println(json2);
    }

    /**
     * Gson解析
     * 
     * @param jsonss
     */
    private static void gsonFinal(String jsonss) {
        // 截取有用的字符串。也可以结合官方解析截取
        //String newJson = jsonss.substring(jsonss.indexOf("["),jsonss.lastIndexOf("]") + 1);
        Gson gson = new Gson();
        A a = gson.fromJson(jsonss, A.class);
        if (a.getStatus().equals("ok")) {
            System.out.println(a.getStatus());
            List<User> data = a.getData();
            for (User user : data) {
                System.out.println(user);
            }
        }
    }
    
    /**
     * TypeToken<>(){}
     * 
     * @param jsons
     */
    private static void gsonTypeToken(String jsons) {
        Gson gson = new Gson();
        // List users = gson.fromJson(jsons, List.class); // 泛型擦除:写的任何的泛型类,变成.class之后泛型都会丢失
        TypeToken<List<User>> listType = new TypeToken<List<User>>() {
        }; // TypeToken<>(){} --> (protected)抽象类 --> 记住泛型的类型 --> new了TypeToken的匿名内部类 
        List<User> users = gson.fromJson(jsons, listType.getType());
        for (User user : users) {
            System.out.println(user);
        }
    }

    /**
     * 解析Json字符串 
     * 反序列化
     * 
     * @param json
     */
    private static void gsonFirst(String json) {
        // 1、创建一个Gson对象
        Gson gson = new Gson();
        // 2、解析字符串
        // --> 必须有无参的构造函数
        // --> 每个属性必须提供setter、getter方法
        User user = gson.fromJson(json, User.class);
        System.out.println(user);
    }
}