Gson在Java中的fromJson()和toJson()方法之间的区别是什么?

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接口来自定义转换规则。

上一篇:没有了

下一篇:Docker 快速入门、核心概念和常用指令

后端开发标签