简介:使用Gson实现了Json的序列化和反序列化!
1.工具类代码:
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
import com.google.gson.reflect.TypeToken;
import java.io.Serializable;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* Created by admin on 2017/9/28.
* 使用Gson实现了Json的序列化和反序列化
*/
public class TestGson {
private static final Gson GSON = new Gson();
private static final Gson gson = new GsonBuilder()
//序列化null,为null的字段也打印出来
.serializeNulls()
// 设置日期时间格式,另有2个重载方法
// 在序列化和反序化时均生效
.setDateFormat("yyyy-MM-dd HH:mm:ss")
// 禁此序列化内部类
//.disableInnerClassSerialization()
//生成不可执行的Json(多了 )]}' 这4个字符)
//.generateNonExecutableJson()
//禁止转义html标签
//.disableHtmlEscaping()
//格式化输出
//.setPrettyPrinting()
//配合@Expose注解使用,用于设置该字段是否需要序列化和反序列化
//.excludeFieldsWithoutExposeAnnotation()
.create();
public static void main(String[] args) {
Person person = new Person();
person.setName("abc");
person.setAge(18);
person.setBirthday(new Date());
String s1 = toJson(person);
System.out.println(s1);
System.out.println("-----------------------");
String toJson = toJson(person);
System.out.println(toJson);
System.out.println("-----------------------");
Person p1 = fromJson(toJson, Person.class);
System.out.println(p1);
System.out.println("-----------------------");
Person p2 = fromJson(toJson, new TypeToken<Person>() {}.getType());
System.out.println(p2);
System.out.println("-----------------------");
List<Person> list = new ArrayList<>();
list.add(p1);
list.add(p2);
list.add(person);
String listToJson = toJson(list);
ArrayList<Person> personList = readValuesAsArrayList(listToJson, new TypeToken<List<Person>>() {}.getType());
System.out.println(personList);
}
/**
* 将Json串反序列化为ArrayList集合
* @param json
* @param t
* @param <T>
* @return
*/
public static <T> ArrayList<T> readValuesAsArrayList(String json, Type t) {
try {
return gson.fromJson(json, t);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 将对象序列化为Json串
* @param obj
* @return
*/
public static String toJson(Object obj){
try {
return gson.toJson(obj);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 将Json串反序列化成对象
* @param json
* @param clazz
* @param <T>
* @return
*/
public static <T> T fromJson(String json, Class<T> clazz){
try {
return gson.fromJson(json, clazz);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 将Json串反序列化成对象
* @param json
* @param type
* @param <T>
* @return
*/
public static <T> T fromJson(String json, Type type){
try {
return gson.fromJson(json, type);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 测试使用实体类Person
*/
public static class Person implements Serializable {
@Expose(deserialize = true,serialize = true)
private String name;
/**
* 用于设置该字段是否需要序列化和反序列化。
* @Expose(deserialize = true,serialize = true) //序列化和反序列化都生效
* @Expose(deserialize = true,serialize = false) //反序列化时生效
* @Expose(deserialize = false,serialize = true) //序列化时生效
* @Expose(deserialize = false,serialize = false) //序列化和反序列化都不生效,即默认。
* 注意:
* 必须设置Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
* 否则注解@Expose不生效。
*/
@Expose(deserialize = true,serialize = true)
private Integer age;
/**
* SerializedName的value属性,用于将birthday字段序列化时的key值
* alternate属性是一个数组,当反序列化时,可以识别任意一个名称与该属性对应
*/
@SerializedName(value = "Birthday", alternate = {"birthday", "birthdate"})
@Expose(deserialize = true,serialize = true)
private Date birthday;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", birthday=" + birthday +
'}';
}
}
}