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字段

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