你还不知道json和对象之间怎么转换吗?(ObjectMapper的使用详解)

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()还有几个重载的方法,
1writeValue(JsonGenerator g, Object value)
2writeValue(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"},这时可以发现,时间已经被格式化了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值