这篇文章主要介绍了Springboot 通过FastJson实现bean对象和Json字符串互转,本文尝试验证两种场景给大家详细介绍,对Springboot FastJson实现bean和Json互转问题,感兴趣的朋友一起看看吧
Json格式在后台服务中的重要性就不多说了,直入正题。
首先引入pom文件,这里使用的是1.2.83版本
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
接着我们尝试验证两种场景
1、Model对象转Json字符串
2、Json字符串转Model对象
在验证之前我们需要先编写一个model类,这个model类的字段我们可以使用fastJson中的注解@JSONField来修饰,并添加name值。
这个注解的作用,将该model类的字段和对应的json对象的key相对应起来。(防盗连接:本文首发自 )
当然你也可以不添加该注解,这样就相当于使用了字段名称本身与json对象的key建立映射。
为了尽可能的展示各种场景,我在下边的model 示例中,使用了好几种场景
1、注解的name值与字段值相同
2、注解的name值与字段值不同
3、不设置注解
4、作用在复杂引用类型上
5、作用在基本类型上
7、作用在容器上
如图
@Data
public class ProjectModel {
@JSONField(name = "projectName")
private String projectName;
@JSONField(name = "projectId")
private int id;
private List<String> userIdList;
@JSONField(name = "userBeanList")
private List<User> userList;
@JSONField(name = "adminUser")
private User adminUser;
@Data
public static class User {
@JSONField(name = "user-id")
private String userId;
private String user_Name;
}
}
接下来我们开始验证:
场景一、Model对象转Json字符串
@PostConstruct
public void handleConvertJson() {
ProjectModel projectModel= createProjectModel();
String projectJson = JSON.toJSONString(projectModel);
System.out.println(projectJson);
}
private ProjectModel createProjectModel() {
ProjectModel projectModel = new ProjectModel();
projectModel.setId(999);
projectModel.setProjectName("p-1");
List<String> userIdList = new ArrayList<>();
userIdList.add("3");
userIdList.add("2");
userIdList.add("1");
projectModel.setUserIdList(userIdList);
ProjectModel.User adminUser=new ProjectModel.User();
adminUser.setUser_Name("admin");
adminUser.setUserId("0");
projectModel.setAdminUser(adminUser);
List<ProjectModel.User> userList = new ArrayList<>();
ProjectModel.User user3 = new ProjectModel.User();
user3.setUserId("3");
user3.setUser_Name("name3");
userList.add(user3);
ProjectModel.User user2 = new ProjectModel.User();
user2.setUserId("2");
user2.setUser_Name("name2");
userList.add(user2);
projectModel.setUserList(userList);
return projectModel;
}
执行结果格式化后如下
{
"adminUser": {
"user-id": "0",
"user_Name": "admin"
},
"projectId": 999,
"projectName": "p-1",
"userBeanList": [
{
"user-id": "3",
"user_Name": "name3"
},
{
"user-id": "2",
"user_Name": "name2"
}
],
"userIdList": [
"3",
"2",
"1"
]
}
注意看,(防盗连接:本文首发自)如果model类字段设置了JSONField注解的话,则优先级最高,如果未设置该注解的话,则按照model类中字段的名称进行设置。而基本类型、复杂类型、复杂类型容器等场景均支持。
场景二、Model对象转Json字符串
新增代码如下:
@PostConstruct
public void handleJson2() {
String newSourceJson="{\"projectId\":999,\"projectName\":\"p-1\"," +
"\"userBeanList\":[{\"userId\":\"3\",\"user_Name\":\"name3\"},{\"user-id\":\"2\"," +
"\"user_Name\":\"name2\"}],\"userIdList\":[\"3\",\"2\",\"1\"]}";
ProjectModel newProject = JSONObject.parseObject(newSourceJson,
ProjectModel.class);
String newProjectJson = JSON.toJSONString(newProject);
System.out.println(newSourceJson);
System.out.println(newProjectJson);
}
Json串我们使用场景1的输出,但是稍作修改:删掉adminUser,同时注意userBeanList容器中的元素,两个id的key不一样,一个叫做userId(类字段名),一个叫做user-id(JSONField的name值)。然后再将对象转为Json串,用这两个Json串进行比较:
经过转换后,userId字段消失了,这是由于null值不会被序列化出来的缘故。也从侧面证明了反序列化时,如果@JSONField存在的话,必须要与@JSONField值保持一致,否则字段值不会写入。如图:
另外我们补充一个特殊情况情况,Model对象的字段为null转Json串时,如何保留null值:(防盗连接:本文首发自)
注意第8行的转换增加了参数SerializerFeature.WriteMapNullValue
@PostConstruct
public void handleJson3() {
String newSourceJson="{\"projectId\":999,\"projectName\":\"p-1\"," +
"\"userBeanList\":[{\"userId\":\"3\",\"user_Name\":\"name3\"},{\"user-id\":\"2\"," +
"\"user_Name\":\"name2\"}],\"userIdList\":[\"3\",\"2\",\"1\"]}";
ProjectModel newProject = JSONObject.parseObject(newSourceJson,
ProjectModel.class);
String newProjectJson=JSON.toJSONString(newProject, SerializerFeature.WriteMapNullValue);
System.out.println(newSourceJson);
System.out.println(newProjectJson);
}
效果如下,生成的json串会保留null字段
到此这篇关于Springboot通过FastJson实现bean对象和Json字符串互转的文章就介绍到这了,更多相关SpringbootFastJson实现bean和Json互转内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
本文标题为:Springboot 通过FastJson实现bean对象和Json字符串互转问题
基础教程推荐
- ConditionalOnProperty配置swagger不生效问题及解决 2023-01-02
- springboot自定义starter方法及注解实例 2023-03-31
- Java数据结构之对象比较详解 2023-03-07
- Java并发编程进阶之线程控制篇 2023-03-07
- JDK数组阻塞队列源码深入分析总结 2023-04-18
- java基础知识之FileInputStream流的使用 2023-08-11
- java实现多人聊天系统 2023-05-19
- Java实现查找文件和替换文件内容 2023-04-06
- Java文件管理操作的知识点整理 2023-05-19
- Java实现线程插队的示例代码 2022-09-03