Google Gson測試對象序列化/反序列化,以及自定義序列化實現

寫在前面

一、簡單測試

1.1、基本類型序列化與反序列化

    @Test
    public void t1() {
        // Serialization
        Gson gson = new Gson();
        System.out.println(gson.toJson(1));
        System.out.println(gson.toJson("abcd"));
        System.out.println(gson.toJson(new Long(10)));
        int[] values = {1};
        System.out.println(gson.toJson(values));

        // Deserialization
        int o1 = gson.fromJson("1", int.class);
        Integer o2 = gson.fromJson("1", Integer.class);
        Long o3 = gson.fromJson("1", Long.class);
        Boolean o4 = gson.fromJson("false", Boolean.class);
        String o5 = gson.fromJson("\"abc\"", String.class);
        String[] anotherStr = gson.fromJson("[\"abc\"]", String[].class);
    }
    • 1
    • “abcd”
    • 10
    • [1]

1.2、Object 示例

 /**
     * Object Example
     * {"value1":1,"value2":"abc"}
     */
@Test
    public void t2() {
        // Serialization
        BagOfPrimitives obj = new BagOfPrimitives();
        Gson gson = new Gson();
        String json = gson.toJson(obj);
        System.out.println(json);

        // Deserialization
        BagOfPrimitives obj2 = gson.fromJson(json, BagOfPrimitives.class);
        System.out.println(obj2.toString());
    }

需要注意: Gson可以很容易地序列化和反序列化靜態嵌套類。
但是,不能自動反序列化純內部類,因爲它們的無參數構造函數還需要一個對包含對象的引用,
而在反序列化時這個引用是不可用的。可以通過使內部類爲靜態或爲其提供自定義InstanceCreator來解決這個問題。這裏有一個例子:

      //    public class InstanceCreatorForB implements InstanceCreator<NestedA.B> {
//        private final A a;
//        public InstanceCreatorForB(A a)  {
//            this.a = a;
//        }
//        public A.B createInstance(Type type) {
//            return a.new B();
//        }
//    }

1.3、數組 示例

 @Test
    public void t3() {
        Gson gson = new Gson();
        int[] ints = {1, 2, 3, 4, 5};
        String[] strings = {"abc", "def", "ghi"};

// Serialization
        gson.toJson(ints);     // ==> [1,2,3,4,5]
        gson.toJson(strings);  // ==> ["abc", "def", "ghi"]

// Deserialization
        int[] ints2 = gson.fromJson("[1,2,3,4,5]", int[].class);

    }

1.4、數組 示例

@Test
    public void t4() {
        Gson gson = new Gson();
        Collection<Integer> ints = Lists.newArrayList(1, 2, 3, 4, 5);

        // Serialization
        String json = gson.toJson(ints);  // ==> json is [1,2,3,4,5]

        // Deserialization
        Type collectionType = new TypeToken<Collection<Integer>>() {
        }.getType();
        Collection<Integer> ints2 = gson.fromJson(json, collectionType);
    }

1.5、泛型的序列化和反序列化

  class Foo<T> {
        T value;
    }

    class Bar {
        String value;
    }

    @Test
    public void t5() {
        Gson gson = new Gson();
        Foo<Bar> foo = new Foo<Bar>();

        // 錯誤示例
        String s = gson.toJson(foo);// 不是很正確
        gson.fromJson(s, foo.getClass()); // 失敗

        // 以下是正確序列化/反序列化
        Type fooType = new TypeToken<Foo<Bar>>() {
        }.getType();
        String s1 = gson.toJson(foo, fooType);

        gson.fromJson(s1, fooType);

    }


1.6、混合類型 集合,如 [‘hello’,5,{name:‘GREETINGS’,source:‘guest’}]


1.7、格式化

    /**
     * pretty style
     * <p>
     * {
     * "name": "GREETINGS",
     * "source": "guest"
     * }
     * {
     * "name": "GREETINGS"
     * }
     */
    @Test
    public void t7() {
        Event event = new Event("GREETINGS", "guest");
        Event event2 = new Event("GREETINGS", null);

        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        String jsonOutput = gson.toJson(event);
        String jsonOutput2 = gson.toJson(event2);

        System.out.println(jsonOutput);
        System.out.println(jsonOutput2);
    }

    /**
     * 空值 賦 null
     * {"name":"GREETINGS","source":null}
     */
    @Test
    public void t8() {
        Event event2 = new Event("GREETINGS", null);

        Gson gson = new GsonBuilder().serializeNulls().create();
        String jsonOutput2 = gson.toJson(event2);
        System.out.println(jsonOutput2);
    }

    /**
     * 版本控制
     * {"newField":"new","field":"old"}
     * <p>
     * {"newerField":"newer","newField":"new","field":"old"}
     */
    @Test
    public void t9() {

        Gson gson = new GsonBuilder().setVersion(1.0).create();

        VersionedClass versionedObject = new VersionedClass();

        String jsonOutput = gson.toJson(versionedObject);
        System.out.println(jsonOutput);
        System.out.println();

        gson = new Gson();
        jsonOutput = gson.toJson(versionedObject);
        System.out.println(jsonOutput);
    }

    /**
     * 自定義命名
     * {"custom_naming":"first","SomeOtherField":"second"}
     */
    @Test
    public void t10() {
        SomeObject someObject = new SomeObject("first", "second");
        Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE).create();
        String jsonRepresentation = gson.toJson(someObject);
        System.out.println(jsonRepresentation);
    }

    /**
     * 時間序列化
     */
    @Test
    public void t11() {
        Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").create();

        String date = "\"2013-02-10T13:45:30+0100\"";
        Date test = gson.fromJson(date, Date.class);
        System.out.println("date:" + test);
    }

二、Gson自定義序列化的實現

2.1、先介紹一下,Gson本身實現的常見的幾種序列化實現

在這裏插入圖片描述

是的,Gson 本身只提供了這六種 ,關於駝峯式命名的轉換,太有限了,先簡單測試一下

  • POJO
@Data
@AllArgsConstructor
public class UserNaming {
    String Name;
    String email_of_developer;
    boolean isDeveloper;
    int _ageOfDeveloper;
}
  • IDENTITY
    /**
     * 原序列
     * FieldNamingPolicy.IDENTITY 測試
     * {"Name":"Norman","email_of_developer":"[email protected]","isDeveloper":true,"_ageOfDeveloper":26}
     */
    @Test
    public void t13() {
        GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.IDENTITY);
        Gson gson = gsonBuilder.create();

        UserNaming user = new UserNaming("Norman", "[email protected]", true, 26);
        String usersJson = gson.toJson(user);

        System.out.println(usersJson);
    }
  • LOWER_CASE_WITH_UNDERSCORES

   /**
     * 下劃線
     * FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES,測試
     * {"name":"Norman","email_of_developer":"[email protected]","is_developer":true,"_age_of_developer":26}
     */
    @Test
    public void t14() {
        GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
        Gson gson = gsonBuilder.create();

        UserNaming user = new UserNaming("Norman", "[email protected]", true, 26);
        String usersJson = gson.toJson(user);

        System.out.println(usersJson);
    }

  • LOWER_CASE_WITH_DASHES
    /**
     * 駝峯中橫線
     * FieldNamingPolicy.LOWER_CASE_WITH_DASHES,測試
     * {"name":"Norman","email_of_developer":"[email protected]","is-developer":true,"_age-of-developer":26}
     */
    @Test
    public void t15() {
        GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_DASHES);
        Gson gson = gsonBuilder.create();

        UserNaming user = new UserNaming("Norman", "[email protected]", true, 26);
        String usersJson = gson.toJson(user);

        System.out.println(usersJson);
    }


  • UPPER_CAMEL_CASE
    /**
     * 駝峯首字母大寫
     * FieldNamingPolicy.UPPER_CAMEL_CASE,測試
     * {"Name":"Norman","Email_of_developer":"[email protected]","IsDeveloper":true,"_AgeOfDeveloper":26}
     */
    @Test
    public void t16() {
        GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE);
        Gson gson = gsonBuilder.create();

        UserNaming user = new UserNaming("Norman", "[email protected]", true, 26);
        String usersJson = gson.toJson(user);

        System.out.println(usersJson);
    }

2.2、自定義 字段轉換策略

  • UPPER_CAMEL_CASE
      /**
     * 駝峯轉空格
     * FieldNamingPolicy.UPPER_CAMEL_CASE,測試
     * {"Name":"Norman","Email_of_developer":"[email protected]","Is Developer":true,"_Age Of Developer":26}
     */
    @Test
    public void t17() {
        GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE_WITH_SPACES);
        Gson gson = gsonBuilder.create();

        UserNaming user = new UserNaming("Norman", "[email protected]", true, 26);
        String usersJson = gson.toJson(user);

        System.out.println(usersJson);
    }


  • 自定義 FieldNamingStrategy
    /**
     * 自定義 - “”替換下劃線
     */
    @Test
    public void t18() {
        FieldNamingStrategy customPolicy = new FieldNamingStrategy() {
            @Override
            public String translateName(Field f) {
                return f.getName().replace("_", "");
            }
        };

        GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.setFieldNamingStrategy(customPolicy);
        Gson gson = gsonBuilder.create();

        UserNaming user = new UserNaming("Norman", "[email protected]", true, 26);
        String usersJson = gson.toJson(user);

        System.out.println(usersJson);
    }



  • 自定義2 FieldNamingStrategy
    /**
     * 自定義字段 轉換
     * {"Name":"Norman","emailOfDeveloper":"[email protected]","isDeveloper":true,"Ageofdeveloper":26}
     */
    @Test
    public void t19() {
        FieldNamingStrategy customPolicy = new FieldNamingStrategy() {
            @Override
            public String translateName(Field f) {
                return StrUtil.toCamelCase(f.getName());
            }
        };

        GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.setFieldNamingStrategy(customPolicy);
        Gson gson = gsonBuilder.create();

        UserNaming user = new UserNaming("Norman", "[email protected]", true, 26);
        String usersJson = gson.toJson(user);

        System.out.println(usersJson);
    }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章