package com.gson.test;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.junit.Test;
import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
public class GsonTest {
private static final Gson gson1 = new Gson();
private static final Gson gson2 = new GsonBuilder()
// 美化输出结果
.setPrettyPrinting()
// 设置日期格式
.setDateFormat("yyyy年MM月dd日-HH时mm分ss秒")
// 为Student类注册StudentTypeAdapter,定制序列化和反序列化规则
.registerTypeAdapter(Student.class, new StudentTypeAdapter())
// 设置字段的命名规则,对使用@SerializedName注解的字段无效
.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
// 设置排除策略
.setExclusionStrategies(new MyExclusionStrategy(Gender.class))
// 仅序列化和反序列化带有@Expose注解的字段
// 注解格式:@Expose (serialize = false, deserialize = false)
// .excludeFieldsWithoutExposeAnnotation()
// 序列化空值,默认空值不会序列化
// .serializeNulls()
// 开启版本控制,与@Until、@Since注解配合使用
.setVersion(1.7)
// 启用对Map中复杂对象的序列化支持
.enableComplexMapKeySerialization().create();
private static final Gson gson3 = new GsonBuilder()
// 美化输出结果
.setPrettyPrinting()
// 设置日期格式
.setDateFormat("yyyy年MM月dd日-HH时mm分ss秒").registerTypeAdapter(Gender.class, new GenderSerializer())
// 仅序列化和反序列化带有@Expose注解的字段
// 注解格式:@Expose (serialize = false, deserialize = false)
.excludeFieldsWithoutExposeAnnotation().create();
@Test
public void testGson1() {
Student user1 = new Student(9527, "瓦力", 16);
Student user2 = new Student(89757, "雪莉", 14);
// 将对象转换为json字符串
String userStr = gson1.toJson(user1);
System.out.println(userStr);
List<Student> userList = new ArrayList<Student>();
userList.add(user1);
userList.add(user2);
// 将对象集合转换为json字符串
String listStr = gson1.toJson(userList);
System.out.println(listStr);
Teacher teacher = new Teacher(200802, "潮歌", userList);
// 将对象转换为json字符串
String jsonStr = gson1.toJson(teacher);
System.out.println(jsonStr);
// 将json字符串还原为对象
Student user = gson1.fromJson(userStr, Student.class);
System.out.println(user);
// 将json字符串还原为对象集合
List<Student> users = gson1.fromJson(listStr, new TypeToken<List<Student>>() {
}.getType());
System.out.println(users);
}
@Test
public void testGson2() {
Student user1 = new Student(9527, "瓦力", 16);
Student user2 = new Student(89757, "雪莉", 14);
user1.setEnrollmentDate(new Date());
user1.setGraduationDate(new Date());
// 将对象转换为json字符串
String userStr = gson2.toJson(user1);
System.out.println(userStr);
List<Student> userList = new ArrayList<Student>();
userList.add(user1);
userList.add(user2);
// 将对象集合转换为json字符串
String listStr = gson2.toJson(userList);
System.out.println(listStr);
// 为保证对象序列化时的顺序,此处使用LinkedHashMap
Map<String, Student> map = new LinkedHashMap<String, Student>();
map.put(user1.getName(), user1);
map.put(user2.getName(), user2);
// 将对象Map转换为json字符串
String mapStr = gson2.toJson(map);
System.out.println(mapStr);
Map<String, Student> retMap = gson2.fromJson(mapStr, new TypeToken<Map<String, Student>>() {
}.getType());
for (Entry<String, Student> entry : retMap.entrySet()) {
System.out.println(entry.getKey() + ":" + entry.getValue());
}
}
@Test
public void testGson3() {
Student user1 = new Student(9527, "瓦力", 16);
Student user2 = new Student(89757, "雪莉", 14);
user1.setGender(Gender.MALE);
user2.setGender(Gender.FEMALE);
// 将对象转换为json字符串
String userStr = gson3.toJson(user1);
System.out.println(userStr);
List<Student> userList = new ArrayList<Student>();
userList.add(user1);
userList.add(user2);
// 将对象集合转换为json字符串
String listStr = gson3.toJson(userList);
System.out.println(listStr);
Map<String, Student> map = new HashMap<String, Student>();
map.put(user1.getName(), user1);
map.put(user2.getName(), user2);
// 将对象Map转换为json字符串
String mapStr = gson3.toJson(map);
System.out.println(mapStr);
Map<String, Student> retMap = gson3.fromJson(mapStr, new TypeToken<Map<String, Student>>() {
}.getType());
for (Entry<String, Student> entry : retMap.entrySet()) {
System.out.println(entry.getKey() + ":" + entry.getValue());
}
}
}