Json格式在後臺服務中的重要性就不多說了,直入正題。首先引入pom文件,這裡使用的是1.2.83版本 1 <dependency> 2 <groupId>com.alibaba</groupId> 3 <artifactId>fastjson</artifactId> 4 <version>1.2 ...
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/