本教程展示如何使用Jackson库的ObjectMapper
类将JSON数据转换为Java对象。
下面我们将详细介绍所需步骤,包括添加依赖项、创建Java类以及编写用于读取JSON文件并将其解析为Java对象的代码。
添加依赖项
在开始之前,确保你在pom.xml
中添加了必要的Jackson依赖项:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>LATEST_VERSION</version> <!-- 请替换为Maven中央仓库上的最新版本 -->
</dependency>
此依赖会自动引入jackson-core
和jackson-annotations
。
定义Java类
接下来,我们定义两个简单的Java类:Post
和Tag
,用于表示博客文章及其标签。
Post.java
package net.javaguides.jackson.pojotojson;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
public class Post {
private Long id;
private String title;
private String description;
private String content;
private Date postedAt = new Date();
private Date lastUpdatedAt = new Date();
private Set<Tag> tags = new HashSet<>();
// Constructors, getters and setters...
}
Tag.java
package net.javaguides.jackson.pojotojson;
public class Tag {
private Long id;
private String name;
// Constructors, getters and setters...
}
使用ObjectMapper将JSON转换为Java对象
现在,我们可以创建一个应用程序来演示如何使用ObjectMapper
从外部JSON文件读取数据,并将其反序列化为Java对象。
JacksonJsonToPojo.java
package net.javaguides.jackson.jsontopojo;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import net.javaguides.jackson.pojotojson.Post;
import net.javaguides.jackson.pojotojson.Tag;
public class JacksonJsonToPojo {
public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {
ObjectMapper mapper = new ObjectMapper();
// Read JSON file and convert to Java object
try (InputStream fileInputStream = new FileInputStream("post.json")) {
Post post = mapper.readValue(fileInputStream, Post.class);
// Print post details
System.out.println("Printing post details");
System.out.println(post.getId());
System.out.println(post.getTitle());
System.out.println(post.getDescription());
System.out.println(post.getContent());
System.out.println(post.getLastUpdatedAt());
System.out.println(post.getPostedAt());
// Print tags of this post
System.out.println("Printing tag details of post :: " + post.getTitle());
for (Tag tag : post.getTags()) {
System.out.println(tag.getId());
System.out.println(tag.getName());
}
}
}
}
这段代码做了如下几件事:
- 创建了一个
ObjectMapper
实例。 - 使用
FileInputStream
打开名为post.json
的文件,并使用ObjectMapper
的readValue
方法将JSON内容解析为Post
对象。 - 打印出
Post
对象的属性值。 - 遍历
Post
对象中的tags
集合,并打印每个Tag
对象的属性值。
注意:在最新的Jackson版本中,推荐使用try-with-resources
语句来确保文件流正确关闭,如上面所示。
当运行这段代码时,它会读取post.json
文件的内容,将其解析为Post
对象,并打印出该对象的所有相关信息,包括其关联的Tag
对象。如果你的JSON文件结构与Post
和Tag
类的结构相匹配,那么这段代码应该可以正常工作。
输出示例
假设post.json
文件包含以下内容:
{
"id": 100,
"title": "Jackson JSON API Guide",
"description": "Post about Jackson JSON API",
"content": "HTML content here",
"postedAt": 1556025668077,
"lastUpdatedAt": 1556025668077,
"tags": [
{"id": 3, "name": "JSON"},
{"id": 1, "name": "Java"},
{"id": 2, "name": "Jackson"}
]
}
执行上述Java程序后,输出将会是:
Printing post details
100
Jackson JSON API Guide
Post about Jackson JSON API
HTML content here
Tue Apr 23 18:51:08 IST 2019
Tue Apr 23 18:51:08 IST 2019
Printing tag details of post :: Jackson JSON API Guide
3
JSON
1
Java
2
Jackson
请注意,日期格式可能因你的时区而异。