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

打印 上一主题 下一主题

主题 892|帖子 892|积分 2676

Json格式在后台服务中的重要性就不多说了,直入正题。
首先引入pom文件,这里使用的是1.2.83版本
  1. 1         <dependency>
  2. 2             <groupId>com.alibaba</groupId>
  3. 3             <artifactId>fastjson</artifactId>
  4. 4             <version>1.2.83</version>
  5. 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. 1 @Data
  2. 2 public class ProjectModel {
  3. 3     @JSONField(name = "projectName")
  4. 4     private String projectName;
  5. 5     @JSONField(name = "projectId")
  6. 6     private int id;
  7. 7     private List<String> userIdList;
  8. 8     @JSONField(name = "userBeanList")
  9. 9     private List<User> userList;
  10. 10     @JSONField(name = "adminUser")
  11. 11     private User adminUser;
  12. 12
  13. 13     @Data
  14. 14     public static class User {
  15. 15         @JSONField(name = "user-id")
  16. 16         private String userId;
  17. 17         private String user_Name;
  18. 18     }
  19. 19 }
复制代码
接下来我们开始验证:
场景一、Model对象转Json字符串
  1. 1     @PostConstruct
  2. 2     public void handleConvertJson() {
  3. 3         ProjectModel projectModel= createProjectModel();
  4. 4         String projectJson = JSON.toJSONString(projectModel);
  5. 5         System.out.println(projectJson);
  6. 6     }
  7. 7
  8. 8
  9. 9     private ProjectModel createProjectModel() {
  10. 10         ProjectModel projectModel = new ProjectModel();
  11. 11         projectModel.setId(999);
  12. 12         projectModel.setProjectName("p-1");
  13. 13         List<String> userIdList = new ArrayList<>();
  14. 14         userIdList.add("3");
  15. 15         userIdList.add("2");
  16. 16         userIdList.add("1");
  17. 17         projectModel.setUserIdList(userIdList);
  18. 18
  19. 19         ProjectModel.User adminUser=new ProjectModel.User();
  20. 20         adminUser.setUser_Name("admin");
  21. 21         adminUser.setUserId("0");
  22. 22         projectModel.setAdminUser(adminUser);
  23. 23
  24. 24         List<ProjectModel.User> userList = new ArrayList<>();
  25. 25         ProjectModel.User user3 = new ProjectModel.User();
  26. 26         user3.setUserId("3");
  27. 27         user3.setUser_Name("name3");
  28. 28         userList.add(user3);
  29. 29         ProjectModel.User user2 = new ProjectModel.User();
  30. 30         user2.setUserId("2");
  31. 31         user2.setUser_Name("name2");
  32. 32         userList.add(user2);
  33. 33         projectModel.setUserList(userList);
  34. 34         return projectModel;
  35. 35     }
复制代码
执行结果格式化后如下
  1. 1 {
  2. 2     "adminUser": {
  3. 3         "user-id": "0",
  4. 4         "user_Name": "admin"
  5. 5     },
  6. 6     "projectId": 999,
  7. 7     "projectName": "p-1",
  8. 8     "userBeanList": [
  9. 9         {
  10. 10             "user-id": "3",
  11. 11             "user_Name": "name3"
  12. 12         },
  13. 13         {
  14. 14             "user-id": "2",
  15. 15             "user_Name": "name2"
  16. 16         }
  17. 17     ],
  18. 18     "userIdList": [
  19. 19         "3",
  20. 20         "2",
  21. 21         "1"
  22. 22     ]
  23. 23 }
复制代码
注意看,(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )如果model类字段设置了JSONField注解的话,则优先级最高,如果未设置该注解的话,则按照model类中字段的名称进行设置。而基本类型、复杂类型、复杂类型容器等场景均支持。
场景二、Model对象转Json字符串
新增代码如下:
  1. 1     @PostConstruct
  2. 2     public void handleJson2() {
  3. 3         String newSourceJson="{"projectId":999,"projectName":"p-1"," +
  4. 4                 ""userBeanList":[{"userId":"3","user_Name":"name3"},{"user-id":"2"," +
  5. 5                 ""user_Name":"name2"}],"userIdList":["3","2","1"]}";
  6. 6         ProjectModel newProject = JSONObject.parseObject(newSourceJson,
  7. 7                 ProjectModel.class);
  8. 8         String newProjectJson = JSON.toJSONString(newProject);
  9. 9         System.out.println(newSourceJson);
  10. 10         System.out.println(newProjectJson);
  11. 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. 1     @PostConstruct
  2. 2     public void handleJson3() {
  3. 3         String newSourceJson="{"projectId":999,"projectName":"p-1"," +
  4. 4                 ""userBeanList":[{"userId":"3","user_Name":"name3"},{"user-id":"2"," +
  5. 5                 ""user_Name":"name2"}],"userIdList":["3","2","1"]}";
  6. 6         ProjectModel newProject = JSONObject.parseObject(newSourceJson,
  7. 7                 ProjectModel.class);
  8. 8         String newProjectJson=JSON.toJSONString(newProject, SerializerFeature.WriteMapNullValue);
  9. 9         System.out.println(newSourceJson);
  10. 10         System.out.println(newProjectJson);
  11. 11     }
复制代码
效果如下,生成的json串会保留null字段

 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

九天猎人

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表