Springboot 通过FastJson实现bean对象和Json字符串互转问题

作者:算死草 时间:2021-11-14 05:10:06 

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串进行比较:

Springboot 通过FastJson实现bean对象和Json字符串互转问题

经过转换后,userId字段消失了,这是由于null值不会被序列化出来的缘故。也从侧面证明了反序列化时,如果@JSONField存在的话,必须要与@JSONField值保持一致,否则字段值不会写入。如图:

Springboot 通过FastJson实现bean对象和Json字符串互转问题

另外我们补充一个特殊情况情况,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字符串互转问题

来源:https://www.cnblogs.com/jilodream/p/16600648.html

标签:Springboot,FastJson,bean,Json,互转
0
投稿

猜你喜欢

  • Druid(新版starter)在SpringBoot下的使用教程

    2021-07-03 20:25:18
  • C#类的多态性详解

    2022-04-27 02:55:42
  • 用C#实现启动另一程序的方法实例

    2023-06-20 12:05:43
  • Android实现分享功能

    2023-12-08 10:10:48
  • JavaWeb开发基于ssm的校园服务系统(实例详解)

    2022-11-07 16:40:48
  • 使用@PathVariable接收两个参数

    2022-12-08 14:21:04
  • Spring Boot整合Lombok的方法详解

    2023-11-22 09:06:21
  • Java 日志打印的15个好建议

    2021-09-08 17:57:42
  • 浅谈C#中堆和栈的区别(附上图解)

    2022-02-15 14:05:09
  • C#获取上个月第一天和最后一天日期的方法

    2023-02-22 07:33:44
  • C#远程获取图片文件流的方法

    2023-03-17 15:15:18
  • QT5实现简单的TCP通信的实现

    2023-11-02 21:24:48
  • C#文件合并的方法

    2022-08-07 13:22:17
  • java实现客房管理系统

    2022-10-15 23:56:33
  • slf4j与jul、log4j1、log4j2、logback的集成原理

    2023-01-31 18:01:47
  • Java基础-Java的体系结构

    2022-05-18 00:19:05
  • C# zxing二维码写入的实例代码

    2021-09-01 12:23:26
  • 简单了解JAVA public class与class区别

    2023-11-15 23:59:26
  • Java框架MyBatis接口编程过程解析

    2022-09-18 07:47:04
  • java使用Abobe Acrobat DC生成模板

    2022-04-14 21:03:12
  • asp之家 软件编程 m.aspxhome.com