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

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

 

标签: Java

添加新评论