Java:Json反序列化自定义类
在Java中,使用Jackson或Gson等库可以方便地实现JSON的反序列化操作。下面将分别介绍如何使用Jackson和Gson来实现自定义类的反序列化。
使用Jackson
首先,确保项目中已经添加了Jackson的依赖。如果你使用的是Maven,可以在pom.xml
中添加如下依赖:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.0</version>
</dependency>
假设你有一个自定义类Person
:
public class Person {
private String name;
private int age;
// 标准的构造函数、getter和setter方法
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
反序列化的代码示例:
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonExample {
public static void main(String[] args) {
String json = "{\"name\":\"John\", \"age\":30}";
ObjectMapper mapper = new ObjectMapper();
try {
Person person = mapper.readValue(json, Person.class);
System.out.println(person.getName() + ", " + person.getAge());
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用Gson
同样,确保你的项目中已经添加了Gson的依赖。如果你使用的是Maven,可以在pom.xml
中添加如下依赖:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.8</version>
</dependency>
假设你有一个自定义类Person
:
public class Person {
private String name;
private int age;
// 标准的构造函数、getter和setter方法省略,同上例。
}
反序列化的代码示例:
import com.google.gson.Gson;
public class GsonExample {
public static void main(String[] args) {
String json = "{\"name\":\"John\", \"age\":30}";
Gson gson = new Gson();
Person person = gson.fromJson(json, Person.class);
System.out.println(person.getName() + ", " + person.getAge());
}
}
注意事项:
-
字段匹配:确保JSON中的字段名与Java类中的字段名匹配。如果不匹配,你可以使用注解(如
@JsonProperty
在Jackson中)来指定字段名。例如,在Jackson中:@JsonProperty("name")
。 -
构造函数:Jackson默认使用默认构造函数进行反序列化,如果需要使用其他构造函数(如带参数的构造函数),可以使用
@JsonCreator
注解标记对应的构造函数。Gson默认不支持带参数的构造函数,需要通过自定义的反序列化器来实现。例如,在Gson中你可以创建一个自定义的反序列化器:new GsonBuilder().registerTypeAdapter(Person.class, new PersonDeserializer()).create();
。这里PersonDeserializer
是一个实现了JsonDeserializer<Person>
接口的类,用于定义如何从JSON反序列化到Person
对象。 -
日期类型:如果你有日期字段,确保正确处理日期格式,Jackson和Gson都支持自定义日期格式或使用特定的日期类型适配器。例如,在Jackson中可以使用
@JsonFormat
注解,在Gson中可以通过自定义TypeAdapter实现。 例如,在Gson中使用自定义TypeAdapter:Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, new JsonDeserializer<Date>() { ... }).create();
这里的匿名类实现了`JsonDeserializer<Date>`接口。 同样,你可以为其他复杂类型创建自定义的序列化器和反序列化器。