首页 > 其他分享 >Springboot 通过FastJson实现bean对象和Json字符串互转

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

时间:2022-08-19 01:00:07浏览次数:80  
标签:FastJson Springboot Json name ProjectModel user 互转 JSONField Name

Json格式在后台服务中的重要性就不多说了,直入正题。
首先引入pom文件,这里使用的是1.2.83版本

1         <dependency>
2             <groupId>com.alibaba</groupId>
3             <artifactId>fastjson</artifactId>
4             <version>1.2.83</version>
5         </dependency>

接着我们尝试验证两种场景
1、Model对象转Json字符串
2、Json字符串转Model对象
在验证之前我们需要先编写一个model类,这个model类的字段我们可以使用fastJson中的注解@JSONField来修饰,并添加name值。
这个注解的作用,将该model类的字段和对应的json对象的key相对应起来。(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )
当然你也可以不添加该注解,这样就相当于使用了字段名称本身与json对象的key建立映射。
为了尽可能的展示各种场景,我在下边的model 示例中,使用了好几种场景
1、注解的name值与字段值相同
2、注解的name值与字段值不同
3、不设置注解
4、作用在复杂引用类型上
5、作用在基本类型上
7、作用在容器上

如图

 1 @Data
 2 public class ProjectModel {
 3     @JSONField(name = "projectName")
 4     private String projectName;
 5     @JSONField(name = "projectId")
 6     private int id;
 7     private List<String> userIdList;
 8     @JSONField(name = "userBeanList")
 9     private List<User> userList;
10     @JSONField(name = "adminUser")
11     private User adminUser;
12 
13     @Data
14     public static class User {
15         @JSONField(name = "user-id")
16         private String userId;
17         private String user_Name;
18     }
19 }

接下来我们开始验证:
场景一、Model对象转Json字符串

 1     @PostConstruct
 2     public void handleConvertJson() {
 3         ProjectModel projectModel= createProjectModel();
 4         String projectJson = JSON.toJSONString(projectModel);
 5         System.out.println(projectJson);
 6     }
 7 
 8 
 9     private ProjectModel createProjectModel() {
10         ProjectModel projectModel = new ProjectModel();
11         projectModel.setId(999);
12         projectModel.setProjectName("p-1");
13         List<String> userIdList = new ArrayList<>();
14         userIdList.add("3");
15         userIdList.add("2");
16         userIdList.add("1");
17         projectModel.setUserIdList(userIdList);
18 
19         ProjectModel.User adminUser=new ProjectModel.User();
20         adminUser.setUser_Name("admin");
21         adminUser.setUserId("0");
22         projectModel.setAdminUser(adminUser);
23 
24         List<ProjectModel.User> userList = new ArrayList<>();
25         ProjectModel.User user3 = new ProjectModel.User();
26         user3.setUserId("3");
27         user3.setUser_Name("name3");
28         userList.add(user3);
29         ProjectModel.User user2 = new ProjectModel.User();
30         user2.setUserId("2");
31         user2.setUser_Name("name2");
32         userList.add(user2);
33         projectModel.setUserList(userList);
34         return projectModel;
35     }

执行结果格式化后如下

 1 {
 2     "adminUser": {
 3         "user-id": "0",
 4         "user_Name": "admin"
 5     },
 6     "projectId": 999,
 7     "projectName": "p-1",
 8     "userBeanList": [
 9         {
10             "user-id": "3",
11             "user_Name": "name3"
12         },
13         {
14             "user-id": "2",
15             "user_Name": "name2"
16         }
17     ],
18     "userIdList": [
19         "3",
20         "2",
21         "1"
22     ]
23 }

注意看,(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )如果model类字段设置了JSONField注解的话,则优先级最高,如果未设置该注解的话,则按照model类中字段的名称进行设置。而基本类型、复杂类型、复杂类型容器等场景均支持。
场景二、Model对象转Json字符串
新增代码如下:

 1     @PostConstruct
 2     public void handleJson2() {
 3         String newSourceJson="{\"projectId\":999,\"projectName\":\"p-1\"," +
 4                 "\"userBeanList\":[{\"userId\":\"3\",\"user_Name\":\"name3\"},{\"user-id\":\"2\"," +
 5                 "\"user_Name\":\"name2\"}],\"userIdList\":[\"3\",\"2\",\"1\"]}";
 6         ProjectModel newProject = JSONObject.parseObject(newSourceJson,
 7                 ProjectModel.class);
 8         String newProjectJson = JSON.toJSONString(newProject);
 9         System.out.println(newSourceJson);
10         System.out.println(newProjectJson);
11     }

Json串我们使用场景1的输出,但是稍作修改:删掉adminUser,同时注意userBeanList容器中的元素,两个id的key不一样,一个叫做userId(类字段名),一个叫做user-id(JSONField的name值)。然后再将对象转为Json串,用这两个Json串进行比较:

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

另外我们补充一个特殊情况情况,Model对象的字段为null转Json串时,如何保留null值:(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )
注意第8行的转换增加了参数SerializerFeature.WriteMapNullValue

 1     @PostConstruct
 2     public void handleJson3() {
 3         String newSourceJson="{\"projectId\":999,\"projectName\":\"p-1\"," +
 4                 "\"userBeanList\":[{\"userId\":\"3\",\"user_Name\":\"name3\"},{\"user-id\":\"2\"," +
 5                 "\"user_Name\":\"name2\"}],\"userIdList\":[\"3\",\"2\",\"1\"]}";
 6         ProjectModel newProject = JSONObject.parseObject(newSourceJson,
 7                 ProjectModel.class);
 8         String newProjectJson=JSON.toJSONString(newProject, SerializerFeature.WriteMapNullValue);
 9         System.out.println(newSourceJson);
10         System.out.println(newProjectJson);
11     }

效果如下,生成的json串会保留null字段

 

标签:FastJson,Springboot,Json,name,ProjectModel,user,互转,JSONField,Name
From: https://www.cnblogs.com/jilodream/p/16600648.html

相关文章

  • springBoot配置文件properties和yml数组写法
    springBoot配置文件properties和yml数组写法springBoot配置文件properties和yml数组写法这里介绍一下springBoot中的两种文件配置方式中数组的使用,也就是集合。以下是......
  • springboot
    @Controller:标识一个Spring类是Spring MVC controller处理器@RestController:@RestController是@Controller和@ResponseBody的结合体,两个标注合并起来的作用@Controller......
  • SpringBoot之发送邮件(手把手教你通过Java发送邮件)
    SpringBoot之发送邮件(手把手教你通过Java发送邮件)前言我们都知道,在使用一个新的APP时经常需要我们注册,注册时需要我们输入手机号然后接受验证码,当然还有一类是需要......
  • springboot
    1、mybatisplus自动填充:数据库级别操作  2、注解:(1)@TableId(type=IdType.INPUT):自动新增Id(2)@TableField//表示在新增时候插入createTime@TableField(fill=......
  • springboot实现多级嵌套并返回json格式的数据处理
    菜单功能列表嵌套菜单解决方案本文目录       菜单功能列表嵌套菜单解决方案           1、通过mapper定义sql的自循环,在查询时就完成菜单的嵌套  ......
  • 海康威视设备网络SDK封装+SpringBoot调用SDK
    最近在使用海康威视的摄像头进行车牌抓拍,使用了海康威视设备网络SDK,便稍做包装,便于项目调用。项目地址https://github.com/Mr-LuXiaoHua/hikivision-sdk海康设备网络SDK......
  • String与StringBuilder相互转换以及获取字符串中第一个中文汉字
    String与StringBuilder相互转换1.StringBuilder转为StringStringBuildersb=newStringBuilder();sb.append("hello");Strings=sb.toString();2.String......
  • SpringBoot中常用的参数注解
    1.@PathVariable获取浏览器请求路径的参数(rest风格)2.@RequestHeader获取请求头3.@RequestParam获取请求参数请求连接:接口:4.@CookieValue获取cookie的值......
  • 两行命令搞定M3U8和MP4文件互转
    用MP4中制作M3U8:ffmpeg-imyVideo.mp4-ccopy-bsfh264_mp4toannexboutput.tsffmpeg-ioutput.ts-ccopy-map0-fsegment-segment_listplaylist.m3u8-seg......
  • 【Springboot】拦截器
    Springboot拦截器1.什么是拦截器?拦截器可以根据URL对请求进行拦截,主要应用于登陆校验、权限验证、乱码解决、性能监控和异常处理等功能。2.定义拦截器步骤在Spring......