一、Jackson的介绍
Jackson是Java领域中一个非常流行的库,用于处理JSON数据。它提供了数据绑定(序列化和反序列化)功能,可以将Java对象转换成JSON格式的数据,也可以将JSON数据转换成Java对象。Jackson由FasterXML公司开发,是许多Java应用中处理JSON的首选库之一。
二、Jackson库特点
1、性能:Jackson以其出色的性能而闻名,特别是在处理大型数据结构时。
2、灵活性:支持各种数据类型,包括复杂的Java对象。
3、扩展性:提供了丰富的扩展API,允许自定义序列化和反序列化行为。
4、兼容性:与Spring框架等其他Java技术栈良好集成。
5、注解:提供了一套注解,用于控制序列化和反序列化的行为。
三、Jackson库简单使用
要在Java项目中使用Jackson,你首先需要添加Jackson库的依赖。以下是Maven依赖示例:
<!-- Jackson核心库 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.13.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.0</version>
</dependency>
请根据需要替换为最新版本号。
序列化(将Java对象转换为JSON)
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonExample {
public static void main(String[] args) {
ObjectMapper mapper = new ObjectMapper();
try {
// 创建一个Java对象
MyObject obj = new MyObject();
obj.setName("Kimi");
obj.setAge(30);
// 将Java对象序列化为JSON字符串
String jsonString = mapper.writeValueAsString(obj);
System.out.println(jsonString);
} catch (Exception e) {
e.printStackTrace();
}
}
}
class MyObject {
private String name;
private int age;
// getters and setters
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;
}
}
反序列化(将JSON转换为Java对象)
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonExample {
public static void main(String[] args) {
ObjectMapper mapper = new ObjectMapper();
try {
// JSON字符串
String jsonString = "{\"name\":\"Kimi\",\"age\":30}";
// 将JSON字符串反序列化为Java对象
MyObject obj = mapper.readValue(jsonString, MyObject.class);
System.out.println(obj.getName());
System.out.println(obj.getAge());
} catch (Exception e) {
e.printStackTrace();
}
}
}
class MyObject {
private String name;
private int age;
// getters and setters
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;
}
}
高级特性
Jackson还提供了许多高级特性,如:
- 注解:通过注解控制序列化和反序列化的行为,例如
@JsonProperty
、@JsonIgnore
等。 - 模块:提供了额外的功能模块,如数据类型模块(处理Java 8日期/时间API)、参数化类型模块等。
- 流式API:提供了流式处理API,用于处理大型JSON数据,减少内存消耗。
四、Jackson库详细使用
1. 自定义模块
自定义一个Jackson模块,用于添加自定义的序列化器和反序列化器:
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
public class MyModule extends SimpleModule {
private static final long serialVersionUID = 1L;
public MyModule() {
super("myModule", VersionUtil.parseVersion("1.0.0", "com.pearl", "jackson-datatype-my"));
}
@Override
public void setupModule(SetupContext context) {
super.setupModule(context);
SimpleDeserializers desers = new SimpleDeserializers();
desers.addDeserializer(ZoneOffset.class, JSR310StringParsableDeserializer.ZONE_OFFSET);
context.addDeserializers(desers);
SimpleSerializers sers = new SimpleSerializers();
sers.addSerializer(ZoneOffset.class, new ToStringSerializer(ZoneOffset.class));
context.addSerializers(sers);
}
}
注册模块到ObjectMapper
:
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.core.Version;
ObjectMapper objectMapper = new ObjectMapper();
Version version = VersionUtil.parseVersion("1.0.0", "com.pearl", "jackson-datatype-my");
SimpleModule myModule = new SimpleModule("myModule", version);
myModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
myModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
objectMapper.registerModule(myModule);
2. 流式API
使用Jackson的流式API来处理JSON数据:
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
public class MyObjectCodec extends com.fasterxml.jackson.core.ObjectCodec {
// 实现自定义的编解码逻辑
}
public class JacksonStreamExample {
public static void main(String[] args) throws IOException {
JsonFactory factory = new JsonFactory();
JsonParser jsonParser = factory.createParser(new File("person.json"));
jsonParser.setCodec(new MyObjectCodec());
Person person = jsonParser.readValueAs(Person.class);
System.out.println(person);
jsonParser.close();
}
}
3. 注解定制序列化和反序列化
使用Jackson注解来定制序列化和反序列化过程:
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;
class User {
@JsonProperty("full_name")
private String name;
private int age;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy")
private Date birthDate;
// getters and setters
}
String jsonString = objectMapper.writeValueAsString(user);
User deserializedUser = objectMapper.readValue(jsonString, User.class);