温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Jackson的基础核心用法有哪些

发布时间:2021-12-13 19:12:12 来源:亿速云 阅读:222 作者:柒染 栏目:大数据

Jackson的基础核心用法有哪些

Jackson是一个用于处理JSON数据的Java库,它提供了强大的功能来将Java对象序列化为JSON字符串,以及将JSON字符串反序列化为Java对象。Jackson库的核心功能包括数据绑定、树模型处理、流式API等。本文将详细介绍Jackson的基础核心用法,帮助开发者快速上手并掌握其基本功能。

1. Jackson简介

Jackson是一个开源的Java库,由FasterXML公司开发和维护。它主要用于处理JSON数据,支持将Java对象序列化为JSON字符串,以及将JSON字符串反序列化为Java对象。Jackson库具有高性能、灵活性和易用性,广泛应用于各种Java项目中。

Jackson库的核心模块包括:

  • jackson-core:提供了底层的流式API,用于解析和生成JSON数据。
  • jackson-databind:提供了数据绑定功能,支持将JSON数据与Java对象之间的相互转换。
  • jackson-annotations:提供了一系列注解,用于控制序列化和反序列化的行为。

2. 基本用法

2.1 添加依赖

在使用Jackson之前,首先需要在项目中添加Jackson库的依赖。如果使用Maven进行项目管理,可以在pom.xml文件中添加以下依赖:

<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.13.3</version> </dependency> 

jackson-databind模块已经包含了jackson-corejackson-annotations模块,因此只需要添加这一个依赖即可。

2.2 基本数据绑定

Jackson的核心功能之一是数据绑定,即将Java对象与JSON数据相互转换。下面通过一个简单的例子来演示如何使用Jackson进行数据绑定。

2.2.1 定义Java类

首先,定义一个简单的Java类Person

public class Person { private String name; private int age; // 无参构造函数 public Person() {} // 全参构造函数 public Person(String name, int age) { this.name = name; this.age = age; } // Getter和Setter方法 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; } @Override public String toString() { return "Person{name='" + name + "', age=" + age + "}"; } } 

2.2.2 序列化

将Java对象序列化为JSON字符串的过程称为序列化。使用Jackson进行序列化非常简单,只需创建一个ObjectMapper对象,并调用其writeValueAsString方法即可。

import com.fasterxml.jackson.databind.ObjectMapper; public class JacksonExample { public static void main(String[] args) throws Exception { // 创建一个Person对象 Person person = new Person("Alice", 30); // 创建ObjectMapper对象 ObjectMapper objectMapper = new ObjectMapper(); // 将Person对象序列化为JSON字符串 String jsonString = objectMapper.writeValueAsString(person); // 输出JSON字符串 System.out.println(jsonString); } } 

运行上述代码,输出结果为:

{"name":"Alice","age":30} 

2.2.3 反序列化

将JSON字符串反序列化为Java对象的过程称为反序列化。使用Jackson进行反序列化同样非常简单,只需调用ObjectMapper对象的readValue方法即可。

import com.fasterxml.jackson.databind.ObjectMapper; public class JacksonExample { public static void main(String[] args) throws Exception { // JSON字符串 String jsonString = "{\"name\":\"Alice\",\"age\":30}"; // 创建ObjectMapper对象 ObjectMapper objectMapper = new ObjectMapper(); // 将JSON字符串反序列化为Person对象 Person person = objectMapper.readValue(jsonString, Person.class); // 输出Person对象 System.out.println(person); } } 

运行上述代码,输出结果为:

Person{name='Alice', age=30} 

2.3 处理复杂对象

在实际开发中,我们经常需要处理包含嵌套对象或集合的复杂对象。Jackson同样可以轻松处理这些情况。

2.3.1 定义复杂Java类

定义一个包含嵌套对象和集合的复杂Java类Company

import java.util.List; public class Company { private String name; private List<Person> employees; // 无参构造函数 public Company() {} // 全参构造函数 public Company(String name, List<Person> employees) { this.name = name; this.employees = employees; } // Getter和Setter方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public List<Person> getEmployees() { return employees; } public void setEmployees(List<Person> employees) { this.employees = employees; } @Override public String toString() { return "Company{name='" + name + "', employees=" + employees + "}"; } } 

2.3.2 序列化复杂对象

将包含嵌套对象和集合的复杂对象序列化为JSON字符串:

import com.fasterxml.jackson.databind.ObjectMapper; import java.util.Arrays; import java.util.List; public class JacksonExample { public static void main(String[] args) throws Exception { // 创建Person对象 Person person1 = new Person("Alice", 30); Person person2 = new Person("Bob", 25); // 创建Company对象 Company company = new Company("Tech Corp", Arrays.asList(person1, person2)); // 创建ObjectMapper对象 ObjectMapper objectMapper = new ObjectMapper(); // 将Company对象序列化为JSON字符串 String jsonString = objectMapper.writeValueAsString(company); // 输出JSON字符串 System.out.println(jsonString); } } 

运行上述代码,输出结果为:

{"name":"Tech Corp","employees":[{"name":"Alice","age":30},{"name":"Bob","age":25}]} 

2.3.3 反序列化复杂对象

将包含嵌套对象和集合的JSON字符串反序列化为复杂对象:

import com.fasterxml.jackson.databind.ObjectMapper; public class JacksonExample { public static void main(String[] args) throws Exception { // JSON字符串 String jsonString = "{\"name\":\"Tech Corp\",\"employees\":[{\"name\":\"Alice\",\"age\":30},{\"name\":\"Bob\",\"age\":25}]}"; // 创建ObjectMapper对象 ObjectMapper objectMapper = new ObjectMapper(); // 将JSON字符串反序列化为Company对象 Company company = objectMapper.readValue(jsonString, Company.class); // 输出Company对象 System.out.println(company); } } 

运行上述代码,输出结果为:

Company{name='Tech Corp', employees=[Person{name='Alice', age=30}, Person{name='Bob', age=25}]} 

2.4 处理日期和时间

在实际开发中,日期和时间的处理是一个常见的需求。Jackson提供了多种方式来处理日期和时间。

2.4.1 使用默认日期格式

默认情况下,Jackson会将java.util.Date对象序列化为时间戳(毫秒数)。例如:

import com.fasterxml.jackson.databind.ObjectMapper; import java.util.Date; public class JacksonExample { public static void main(String[] args) throws Exception { // 创建一个包含日期的对象 Event event = new Event("Meeting", new Date()); // 创建ObjectMapper对象 ObjectMapper objectMapper = new ObjectMapper(); // 将Event对象序列化为JSON字符串 String jsonString = objectMapper.writeValueAsString(event); // 输出JSON字符串 System.out.println(jsonString); } } class Event { private String name; private Date eventDate; // 无参构造函数 public Event() {} // 全参构造函数 public Event(String name, Date eventDate) { this.name = name; this.eventDate = eventDate; } // Getter和Setter方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getEventDate() { return eventDate; } public void setEventDate(Date eventDate) { this.eventDate = eventDate; } @Override public String toString() { return "Event{name='" + name + "', eventDate=" + eventDate + "}"; } } 

运行上述代码,输出结果为:

{"name":"Meeting","eventDate":1672502400000} 

2.4.2 自定义日期格式

如果希望使用自定义的日期格式,可以通过@JsonFormat注解来实现。例如:

import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.Date; public class JacksonExample { public static void main(String[] args) throws Exception { // 创建一个包含日期的对象 Event event = new Event("Meeting", new Date()); // 创建ObjectMapper对象 ObjectMapper objectMapper = new ObjectMapper(); // 将Event对象序列化为JSON字符串 String jsonString = objectMapper.writeValueAsString(event); // 输出JSON字符串 System.out.println(jsonString); } } class Event { private String name; @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss") private Date eventDate; // 无参构造函数 public Event() {} // 全参构造函数 public Event(String name, Date eventDate) { this.name = name; this.eventDate = eventDate; } // Getter和Setter方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getEventDate() { return eventDate; } public void setEventDate(Date eventDate) { this.eventDate = eventDate; } @Override public String toString() { return "Event{name='" + name + "', eventDate=" + eventDate + "}"; } } 

运行上述代码,输出结果为:

{"name":"Meeting","eventDate":"2023-01-01 00:00:00"} 

2.5 处理枚举类型

Jackson可以轻松处理枚举类型。默认情况下,Jackson会将枚举类型序列化为其名称。例如:

import com.fasterxml.jackson.databind.ObjectMapper; public class JacksonExample { public static void main(String[] args) throws Exception { // 创建一个包含枚举类型的对象 Order order = new Order(1, Status.PENDING); // 创建ObjectMapper对象 ObjectMapper objectMapper = new ObjectMapper(); // 将Order对象序列化为JSON字符串 String jsonString = objectMapper.writeValueAsString(order); // 输出JSON字符串 System.out.println(jsonString); } } class Order { private int id; private Status status; // 无参构造函数 public Order() {} // 全参构造函数 public Order(int id, Status status) { this.id = id; this.status = status; } // Getter和Setter方法 public int getId() { return id; } public void setId(int id) { this.id = id; } public Status getStatus() { return status; } public void setStatus(Status status) { this.status = status; } @Override public String toString() { return "Order{id=" + id + ", status=" + status + "}"; } } enum Status { PENDING, PROCESSING, COMPLETED } 

运行上述代码,输出结果为:

{"id":1,"status":"PENDING"} 

2.6 处理空值和默认值

在实际开发中,我们经常需要处理空值和默认值。Jackson提供了多种方式来处理这些情况。

2.6.1 忽略空值

默认情况下,Jackson会序列化所有字段,包括空值。如果希望忽略空值,可以通过@JsonInclude注解来实现。例如:

import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.ObjectMapper; public class JacksonExample { public static void main(String[] args) throws Exception { // 创建一个包含空值的对象 Person person = new Person(null, 30); // 创建ObjectMapper对象 ObjectMapper objectMapper = new ObjectMapper(); // 将Person对象序列化为JSON字符串 String jsonString = objectMapper.writeValueAsString(person); // 输出JSON字符串 System.out.println(jsonString); } } @JsonInclude(JsonInclude.Include.NON_NULL) class Person { private String name; private int age; // 无参构造函数 public Person() {} // 全参构造函数 public Person(String name, int age) { this.name = name; this.age = age; } // Getter和Setter方法 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; } @Override public String toString() { return "Person{name='" + name + "', age=" + age + "}"; } } 

运行上述代码,输出结果为:

{"age":30} 

2.6.2 设置默认值

如果希望在反序列化时为某些字段设置默认值,可以通过@JsonSetter注解来实现。例如:

import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.databind.ObjectMapper; public class JacksonExample { public static void main(String[] args) throws Exception { // JSON字符串 String jsonString = "{\"age\":30}"; // 创建ObjectMapper对象 ObjectMapper objectMapper = new ObjectMapper(); // 将JSON字符串反序列化为Person对象 Person person = objectMapper.readValue(jsonString, Person.class); // 输出Person对象 System.out.println(person); } } class Person { private String name; private int age; // 无参构造函数 public Person() {} // 全参构造函数 public Person(String name, int age) { this.name = name; this.age = age; } // Getter和Setter方法 public String getName() { return name; } @JsonSetter("name") public void setName(String name) { this.name = name == null ? "Unknown" : name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person{name='" + name + "', age=" + age + "}"; } } 

运行上述代码,输出结果为:

Person{name='Unknown', age=30} 

2.7 处理多态类型

在实际开发中,我们经常需要处理多态类型。Jackson提供了多种方式来处理多态类型。

2.7.1 使用@JsonTypeInfo注解

通过@JsonTypeInfo注解,可以在序列化和反序列化时处理多态类型。例如:

import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.databind.ObjectMapper; public class JacksonExample { public static void main(String[] args) throws Exception { // 创建一个Animal对象 Animal animal = new Dog("Buddy", 3); // 创建ObjectMapper对象 ObjectMapper objectMapper = new ObjectMapper(); // 将Animal对象序列化为JSON字符串 String jsonString = objectMapper.writeValueAsString(animal); // 输出JSON字符串 System.out.println(jsonString); // 将JSON字符串反序列化为Animal对象 Animal deserializedAnimal = objectMapper.readValue(jsonString, Animal.class); // 输出反序列化后的Animal对象 System.out.println(deserializedAnimal); } } @JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type" ) @JsonSubTypes({ @JsonSubTypes.Type(value = Dog.class, name = "dog"), @JsonSubTypes.Type(value = Cat.class, name = "cat") }) abstract class Animal { private String name; // 无参构造函数 public Animal() {} // 全参构造函数 public Animal(String name) { this.name = name; } // Getter和Setter方法 public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Animal{name='" + name + "'}"; } } class Dog extends Animal { private int age; // 无参构造函数 public Dog() {} // 全参构造函数 public Dog(String name, int age) { super(name); this.age = age; } // Getter和Setter方法 public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Dog{name='" + getName() + "', age=" + age + "}"; } } class Cat extends Animal { private String color; // 无参构造函数 public Cat() {} // 全参构造函数 public Cat(String name, String color) { super(name); this.color = color; } // Getter和Setter方法 public String getColor() { return color; } public void setColor(String color) { this.color = color; } @Override public String toString() { return "Cat{name='" + getName() + "', color='" + color + "'}"; } } 

运行上述代码,输出结果为:

”`json {“type”:“dog”,“name”:“Bud

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI