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互转内容请搜索易知道(ezd.cc)以前的文章或继续浏览下面的相关文章希望大家以后多多支持易知道(ezd.cc)!

推荐阅读

    bean生命周期的4个阶段是什么

    bean生命周期的4个阶段是什么,生命周期,方法,本文目录bean生命周期的4个阶段是什么java spring框架中,bean的生命周期是什么spring中bean

    SpringBoot自动配置的实现原理是什么

    SpringBoot自动配置的实现原理是什么,配置,组件,文件,方法,注册,获取,一、什么是springboot自动配置SpringBoot通过@EnableAutoConfiguration注

    SpringBoot启动流程是什么

    SpringBoot启动流程是什么,应用程序,方法,组件,上下文,对象,配置,SpringBoot启动过程简介SpringBoot应用程序的启动过程可以分为以下几个步骤:加

    JavaBean内省与BeanInfo

    JavaBean内省与BeanInfo,方法,属性,Java的BeanInfo在工作中并不怎么用到,我也是在学习spring源码的时候,发现SpringBoot启动时候会设置一个

    javabean是什么东西(javabean详细介绍)

    javabean是什么东西(javabean详细介绍),编译,公司,后缀名,文件,都是,专有名词,  首先,在开始本章之前,先说一个总的概念:所谓的Java Bean,就是

    NetBeans 6.1中的FTP

    NetBeans 6.1中的FTP,NetBeans 6.1中的FTP,帮助手册,服务,控件,浏览器,FTP in NetBeans 6.1在NetBeans 6.1中是否隐藏了FTP浏览器?帮助手册

    SpringBoot之整合Shiro

    SpringBoot之整合Shiro,SpringBoot,之,整合,Shiro,1.SpringBoot,整合,Shiro,,1.SpringBoot整合Shiro思路2. 环境搭建2.1 创建项目2.2 引入