java gson
导言
在现代的软件开发中,数据的序列化与反序列化是一个非常重要的环节。而在Java语言中,Gson库是一个高效、强大的Json处理库,可以帮助我们实现数据的序列化与反序列化。本文将详细介绍Gson库的基本使用以及一些高级功能。
Gson库简介
Gson是Google开发的一个Java库,用于在Java对象和JSON数据之间进行序列化和反序列化。它可以将Java对象转换为对应的JSON字符串,也可以将JSON字符串转换为对应的Java对象。Gson提供了一系列灵活的API,可以帮助我们在序列化和反序列化过程中进行灵活的配置。
Gson的基本用法
添加Gson库的依赖
在开始使用Gson之前,我们首先需要在我们的项目中添加Gson库的依赖。可以通过Maven或者Gradle来完成。以下是添加Gson库的Gradle依赖的示例:
dependencies {
implementation 'com.google.code.gson:gson:2.8.7'
}
创建Gson对象
在使用Gson库之前,我们需要创建一个Gson对象。Gson对象是进行序列化和反序列化操作的入口点。可以通过以下方式来创建Gson对象:
Gson gson = new Gson();
将Java对象序列化为JSON字符串
Gson库提供了一个toJson()方法,可以将Java对象序列化为对应的JSON字符串。以下是一个示例:
public class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
public static void main(String[] args) {
Person person = new Person("Alice", 20);
Gson gson = new Gson();
String json = gson.toJson(person);
System.out.println(json);
}
输出:
{"name":"Alice","age":20}
在上面的示例中,我们通过调用toJson()方法将Person对象序列化成了对应的JSON字符串。
将JSON字符串反序列化为Java对象
Gson库同样提供了一个fromJson()方法,可以将JSON字符串反序列化为对应的Java对象。以下是一个示例:
public static void main(String[] args) {
String json = "{\"name\":\"Alice\",\"age\":20}";
Gson gson = new Gson();
Person person = gson.fromJson(json, Person.class);
System.out.println(person.name);
System.out.println(person.age);
}
输出:
Alice
20
在上面的示例中,我们通过调用fromJson()方法将JSON字符串反序列化为Person对象,并输出了对象的name和age属性。
处理复杂类型
除了基本类型和简单的Java对象之外,Gson库还可以处理复杂的数据类型,如数组、集合、嵌套对象等。以下是一些示例:
数组
public static void main(String[] args) {
int[] numbers = {1, 2, 3, 4, 5};
Gson gson = new Gson();
String json = gson.toJson(numbers);
System.out.println(json);
int[] restoredNumbers = gson.fromJson(json, int[].class);
for (int number : restoredNumbers) {
System.out.println(number);
}
}
输出:
[1,2,3,4,5]
1
2
3
4
5
集合
public static void main(String[] args) {
List<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
names.add("Charlie");
Gson gson = new Gson();
String json = gson.toJson(names);
System.out.println(json);
Type listType = new TypeToken<List<String>>(){}.getType();
List<String> restoredNames = gson.fromJson(json, listType);
for (String name : restoredNames) {
System.out.println(name);
}
}
输出:
["Alice","Bob","Charlie"]
Alice
Bob
Charlie
嵌套对象
public class Address {
String city;
String street;
public Address(String city, String street) {
this.city = city;
this.street = street;
}
}
public class Person {
String name;
int age;
Address address;
public Person(String name, int age, Address address) {
this.name = name;
this.age = age;
this.address = address;
}
}
public static void main(String[] args) {
Address address = new Address("CityA", "StreetA");
Person person = new Person("Alice", 20, address);
Gson gson = new Gson();
String json = gson.toJson(person);
System.out.println(json);
Person restoredPerson = gson.fromJson(json, Person.class);
System.out.println(restoredPerson.name);
System.out.println(restoredPerson.age);
System.out.println(restoredPerson.address.city);
System.out.println(restoredPerson.address.street);
}
输出:
{"name":"Alice","age":20,"address":{"city":"CityA","street":"StreetA"}}
Alice
20
CityA
StreetA
自定义序列化和反序列化逻辑
在某些情况下,我们可能需要自定义对象的序列化和反序列化逻辑。Gson库提供了一系列接口和注解,可以帮助我们实现自定义逻辑。以下是一些示例:
使用注解
public class Person {
@SerializedName("full_name")
String fullName;
int age;
public Person(String fullName, int age) {
this.fullName = fullName;
this.age = age;
}
}
public static void main(String[] args) {
Person person = new Person("Alice", 20);
Gson gson = new Gson();
String json = gson.toJson(person);
System.out.println(json);
Person restoredPerson = gson.fromJson(json, Person.class);
System.out.println(restoredPerson.fullName);
System.out.println(restoredPerson.age);
}
输出:
{"full_name":"Alice","age":20}
Alice
20
在上面的示例中,我们使用了@SerializedName注解来指定JSON中的字段名称与Java对象中的属性名称的对应关系。
实现接口
class PersonAdapter implements JsonSerializer<Person>, JsonDeserializer<Person> {
@Override
public JsonElement serialize(Person src, Type typeOfSrc, JsonSerializationContext context) {
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("name", src.fullName);
jsonObject.addProperty("age", src.age);
return jsonObject;
}
@Override
public Person deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonObject jsonObject = json.getAsJsonObject();
String fullName = jsonObject.get("name").getAsString();
int age = jsonObject.get("age").getAsInt();
return new Person(fullName, age);
}
}
public static void main(String[] args) {
Person person = new Person("Alice", 20);
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Person.class, new PersonAdapter());
Gson gson = gsonBuilder.create();
String json = gson.toJson(person);
System.out.println(json);
Person restoredPerson = gson.fromJson(json, Person.class);
System.out.println(restoredPerson.fullName);
System.out.println(restoredPerson.age);
}
输出:
{"name":"Alice","age":20}
Alice
20