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字段
如果你觉得写的不错,欢迎转载和点赞。
转载时请保留作者署名jilodream/王若伊_恩赐解脱(博客链接:http://www.cnblogs.com/jilodream/
来源:https://www.cnblogs.com/jilodream/p/16600648.html
本站部分图文来源于网络,如有侵权请联系删除。