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);
}