介绍
在开发中,我们经常会用到JSON对象,而为了数据传输方便,我们还经常会使用JSONString,那么如果我们得到了一个JSONString,并且知道它对应一个实体类,如何将JSONString转为实体类呢?
使用FastJSON
利用FastJSON的parseObject方法,核心代码
/***
* 将JSON文本反序列化到对象
*/
public static <T> T toBean(String jsonString, Class<T> bean) {
T t = (T) JSON.parseObject(jsonString, bean); // fastjson
return t;
}
测试代码
package com.example.json.test;
import com.alibaba.fastjson.JSON;
import com.example.json.dto.User;
import com.example.json.util.JSONUtil;
public class TestFunction {
public static void main(String[] args) {
//声明对象
User user = new User();
user.setId("111");
user.setUsername("tom");
// user.setPassword("abc");
//将对象转成JSONString
String userString = JSON.toJSONString(user);
System.out.println(userString);
//将JSONString转成对象
User userEntity = JSONUtil.toBean(userString, User.class);
System.out.println(userEntity);
}
}
工具类
package com.example.json.util;
import com.alibaba.fastjson.JSON;
public class JSONUtil {
/***
* 将JSON文本反序列化到对象
*/
public static <T> T toBean(String jsonString, Class<T> bean) {
T t = (T) JSON.parseObject(jsonString, bean); // fastjson
return t;
}
}
实体
package com.example.json.dto;
import lombok.Data;
@Data
public class User {
private String id;
private String username;
private String password;
}
pom依赖
<!--fastjson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.69</version>
</dependency>
结果
我们注意到,即使不给password赋值,转换时也是没有问题的,没有的就赋值null或默认值
另一场景
但是我们想一想,如果我们传的JSONString和实体不对应,如JSONString对应的是UserAdd实体,但是转换时我们想转成User实体,可不可以呢?(事实上,这种场景在实际开发中是十分常见的)
我们来结合代码看一下吧
我们声明一个新的实体UserAdd,实体的部分字段和User一致
package com.example.json.dto;
import lombok.Data;
@Data
public class UserAdd {
private String id;
private String username;
private String passwors;
private String sex;
}
假设现在我们接收到的JSONString是UserAdd的,但我们仍将它转成User实体,会发生什么呢?
...
UserAdd userAdd = new UserAdd();
userAdd.setId("111");
userAdd.setUsername("tom");
userAdd.setPasswors("abc");
userAdd.setSex("f");
//将对象转成JSONString
String userString = JSON.toJSONString(userAdd);
System.out.println(userString);
//将JSONString转成对象
User userEntity = JSONUtil.toBean(userString, User.class);
System.out.println(userEntity);
...
结果
总结
我们会发现,它只将相同属性的部分赋值了,不同属性的部分,如果User中没有该字段,就不处理,如果User中有的字段就赋默认值