ObjectMapper的使用详解(json 类型和对象之间相互转换的工具)
Jackson ObjectMapper类(com.fasterxml.jackson.databind.ObjectMapper)是使用Jackson解析JSON最简单的方法。
Jackson ObjectMapper可以从字符串、流或文件解析JSON,并创建Java对象或对象图来表示已解析的JSON。
将JSON解析为Java对象也称为从JSON反序列化Java对象,Jackson ObjectMapper也可以从Java对象创建JSON.
从Java对象生成JSON的过程也被称为序列化Java对象到JSON
Jackson对象映射器(ObjectMapper)可以把JSON解析为用户自定义类对象, 或者解析为JSON内置的树模型的对象。
一、 ObjectMapper的使用
1、引入jar包
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.9</version>
</dependency>
2、使用ObjectMapper 实现对象和json之间的相互转换
- 先建一个实体类 User
public class User {
private Integer id;
private String username;
private String password;
private Date createTime;
public int getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", password=" + password + ", createTime=" + createTime + "]";
}
}
(1) 把对象转化成json
- 将实体类User转成json字符串对象,使用writeValueAsString()方法
@Test
public void omTest() {
ObjectMapper mapper = new ObjectMapper();
User user = new User();
user.setId(3);
user.setCreateTime(new Date());
user.setPassword("123456");
user.setUsername("hengheng");
try {
//转换成json字符串
System.out.println(mapper.writeValueAsString(user));
System.out.println("***************");
} catch (Exception e) {
e.printStackTrace();
}
}
//输出结果 {"id":3,"username":"hengheng","password":"123456","createTime":1594283850147} ,这里有一个小小的问题,时间转换成了long类型的时间戳,而不是字符串,在下面我们会实现怎么将时间格式化成字符串
- 通过IO流的方式保存到本地的.json文件中, writeValue()方法
@Test
public void omTest() {
ObjectMapper mapper = new ObjectMapper();
User user = new User();
user.setId(3);
user.setCreateTime(new Date());
user.setPassword("123456");
user.setUsername("hengheng");
try {
//以文件流的方式保存到本地
mapper.writeValue(new FileOutputStream("G://json.json"), user);
} catch (Exception e) {
e.printStackTrace();
}
}
writeValue()还有几个重载的方法,
1、 writeValue(JsonGenerator g, Object value)
2、writeValue(DataOutput out, Object value)等, 具体的用法和上一个一样,这里不做具体的展示了,有兴趣的可以自己手动实现一下
- 转换成字节数组,使用writeValueAsBytes(Object value)方法
@Test
public void omTest() {
ObjectMapper mapper = new ObjectMapper();
User user = new User();
user.setId(3);
user.setCreateTime(new Date());
user.setPassword("123456");
user.setUsername("hengheng");
try {
//转换成字节数组
System.out.println(mapper.writeValueAsBytes(user));
System.out.println("***********");
} catch (Exception e) {
e.printStackTrace();
}
}
(2)把json转换成对象
- 从json字符串中读取java对象
ObjectMapper mapper = new ObjectMapper();
String jsonStr = "{\"id\":3,\"username\":\"hengheng\",\"password\":\"123456\",\"createTime\":1594282475030}";
try {
System.out.println(mapper.readValue(jsonStr, User.class));
} catch (IOException e) {
e.printStackTrace();
}
//输出结果 User [id=3, username=hengheng, password=123456, createTime=Thu Jul 09 16:14:35 CST 2020]
- 从json文件中读取java 对象
ObjectMapper mapper = new ObjectMapper();
//String jsonStr = "{\"id\":3,\"username\":\"hengheng\",\"password\":\"123456\",\"createTime\":1594282475030}";
try {
System.out.println(mapper.readValue(new File("G://json.json"), User.class));
} catch (IOException e) {
e.printStackTrace();
}
- 从JSON数组字符串读取Java对象数组
String jsonArray = "[{\"brand\":\"ford\"}, {\"brand\":\"Fiat\"}]";
ObjectMapper objectMapper = new ObjectMapper();
Car[] cars2 = objectMapper.readValue(jsonArray, Car[].class);
还有几种读取方式,这里不一一列举,例如:从URL获取JSON数据读取Java对象,从Java InputStream获取JSON数据读取Java对象,从字节数组获取JSON数据读取Java对象,从JSON数组字符串读取Java List对象,从JSON字符串读取Java Map对象
(3)序列化时间
在上面的过程中,我们似乎发现了一点问题,就是Date类型的转换变成了时间戳,这显然不是我们想要的。
通过制定格式化的样式来转换时间。
@Test
public void changeDate(){
User user = new User();
user.setId(3);
user.setCreateTime(new Date());
user.setPassword("123456");
user.setUsername("hengheng");
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(dateFormat);
try {
System.out.println(mapper.writeValueAsString(user));
} catch (JsonProcessingException e) {
e.printStackTrace();
}
//输出结果 {"id":3,"username":"hengheng","password":"123456","createTime":"2020-07-09 04:52:06"},这时可以发现,时间已经被格式化了