1. 引言
Gson是Google开发的Java库,可以轻松地将Java对象转换为JSON格式,并将JSON格式转换为Java对象。在Gson中,有两个核心方法JsonSerializer和JsonDeserializer。其中,fromJson()方法是将JSON字符串转换为Java对象,而toJson()方法则是将Java对象转换为JSON字符串。本文着重分析Gson在Java中fromJson()方法和toJson()方法之间的区别。
2. fromJson()方法
2.1 方法定义
在Gson中,fromJson()方法是将JSON字符串转换为Java对象的方法。它的方法定义如下:
public T fromJson(String json, Class classOfT) throws JsonSyntaxException
其中,参数json是JSON格式的字符串,而classOfT是要转换的目标Java对象的类型,例如:
String json = "{\"name\":\"Tom\",\"age\":18}";
Person person = gson.fromJson(json, Person.class);
这里我们将一个名为"Tom"、年龄为18的Person对象的JSON格式字符串转换为了Person对象。
2.2 使用示例
下面是fromJson()方法的另一个使用示例,我们将一个较为复杂的JSON格式字符串转换为一个Java对象:
String jsonString = "{\"name\":\"Tom\",\"age\":20,\"email\":\"tom@gmail.com\",\"address\":" +
"{\"city\":\"Beijing\",\"country\":\"China\"},\"languages\":[\"Java\",\"Python\",\"C++\"]}";
Gson gson = new Gson();
Person person = gson.fromJson(jsonString, Person.class);
System.out.println(person.toString());
JSON格式字符串如下:
{
"name": "Tom",
"age": 20,
"email": "tom@gmail.com",
"address": {
"city": "Beijing",
"country": "China"
},
"languages": [
"Java",
"Python",
"C++"
]
}
Person类的定义如下:
class Person {
private String name;
private int age;
private String email;
private Address address;
private List languages;
//getters and setters
@Override
public String toString() {
return "name: " + name +
"\nage: " + age +
"\nemail: " + email +
"\naddress: " + address +
"\nlanguages: " + languages;
}
}
class Address {
private String city;
private String country;
//getters and setters
@Override
public String toString() {
return city + ", " + country;
}
}
运行结果如下:
name: Tom
age: 20
email: tom@gmail.com
address: Beijing, China
languages: [Java, Python, C++]
可以看到,fromJson()方法将JSON格式字符串转换为了Person对象,并且Address对象也被正确地嵌套在了Person对象中。
3. toJson()方法
3.1 方法定义
与fromJson()方法相反,在Gson中,toJson()方法用于将Java对象转换为JSON格式的字符串。它的方法定义如下:
public String toJson(Object src)
其中,参数src是要转换为JSON格式的Java对象。
3.2 使用示例
下面是toJson()方法的使用示例,我们将一个Person对象转换为JSON格式的字符串:
Person person = new Person();
person.setName("Tom");
person.setAge(20);
person.setEmail("tom@gmail.com");
Address address = new Address();
address.setCity("Beijing");
address.setCountry("China");
List languages = new ArrayList<>();
languages.add("Java");
languages.add("Python");
languages.add("C++");
person.setAddress(address);
person.setLanguages(languages);
Gson gson = new Gson();
String jsonString = gson.toJson(person);
System.out.println(jsonString);
输出结果如下:
{
"name": "Tom",
"age": 20,
"email": "tom@gmail.com",
"address": {
"city": "Beijing",
"country": "China"
},
"languages": [
"Java",
"Python",
"C++"
]
}
可以看到,toJson()方法将Person对象转换为了JSON格式的字符串,并且嵌套的Address对象和List对象也被正确地转换为了JSON格式。
4. 两者的区别
4.1 转换方向不同
首先,fromJson()方法是将JSON格式字符串转换为Java对象,而toJson()方法则是将Java对象转换为JSON格式字符串。这是两者最大的不同之处。
4.2 转换结果类型不同
其次,两者转换的结果类型也不同。fromJson()方法将JSON字符串转换为Java对象,返回值是Java对象类型;而toJson()方法将Java对象转换为JSON字符串,返回值是字符串类型。
4.3 toJson()方法可以定制转换规则
除此之外,toJson()方法还有一个重要的特点:可以定制转换规则。Gson提供了JsonSerializer和JsonDeserializer两个接口,可以实现定制化的转换规则。例如,对于Person类的性别属性,我们可能想将其转换为数字类型,而不是字符串类型。我们可以创建一个SexSerializer实现JsonSerializer接口,实现如下:
class SexSerializer implements JsonSerializer {
@Override
public JsonElement serialize(Sex sex, Type typeOfSrc, JsonSerializationContext context) {
return new JsonPrimitive(sex.getValue());
}
}
其中,Sex是一个枚举类型,getValue()是获取其对应的数字值的方法。然后,我们可以使用GsonBuilder来注册我们的SexSerializer,如下:
Gson gson = new GsonBuilder()
.registerTypeAdapter(Sex.class, new SexSerializer())
.create();
String jsonString = gson.toJson(person);
System.out.println(jsonString);
最终输出结果如下:
{
"name": "Tom",
"age": 20,
"email": "tom@gmail.com",
"sex": 1,
"address": {
"city": "Beijing",
"country": "China"
},
"languages": [
"Java",
"Python",
"C++"
]
}
从结果中可以看到,我们将Person中的sex属性由String类型转换为了数字类型,并且生成的JSON字符串也是根据我们的转换规则进行转换的。
5. 结论
Gson中的fromJson()方法和toJson()方法是将JSON格式字符串和Java对象相互转换的核心方法。两者之间的最大区别是转换的方向和转换结果的类型。此外,toJson()方法还具有定制转换规则的功能,可以通过实现JsonSerializer和JsonDeserializer接口来自定义转换规则。