Springboot?通過FastJson實現bean對象和Json字符串互轉問題
Json格式在后臺服務中的重要性就不多說了,直入正題。
首先引入pom文件,這里使用的是1.2.83版本
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.83</version> </dependency>
接著我們嘗試驗證兩種場景
1、Model對象轉Json字符串
2、Json字符串轉Model對象
在驗證之前我們需要先編寫一個model類,這個model類的字段我們可以使用fastJson中的注解@JSONField來修飾,并添加name值。
這個注解的作用,將該model類的字段和對應的json對象的key相對應起來。(防盜連接:本文首發(fā)自 )
當然你也可以不添加該注解,這樣就相當于使用了字段名稱本身與json對象的key建立映射。
為了盡可能的展示各種場景,我在下邊的model 示例中,使用了好幾種場景
1、注解的name值與字段值相同
2、注解的name值與字段值不同
3、不設置注解
4、作用在復雜引用類型上
5、作用在基本類型上
7、作用在容器上
如圖
@Data public class ProjectModel { @JSONField(name = "projectName") private String projectName; @JSONField(name = "projectId") private int id; private List<String> userIdList; @JSONField(name = "userBeanList") private List<User> userList; @JSONField(name = "adminUser") private User adminUser; @Data public static class User { @JSONField(name = "user-id") private String userId; private String user_Name; } }
接下來我們開始驗證:
場景一、Model對象轉Json字符串
@PostConstruct public void handleConvertJson() { ProjectModel projectModel= createProjectModel(); String projectJson = JSON.toJSONString(projectModel); System.out.println(projectJson); } private ProjectModel createProjectModel() { ProjectModel projectModel = new ProjectModel(); projectModel.setId(999); projectModel.setProjectName("p-1"); List<String> userIdList = new ArrayList<>(); userIdList.add("3"); userIdList.add("2"); userIdList.add("1"); projectModel.setUserIdList(userIdList); ProjectModel.User adminUser=new ProjectModel.User(); adminUser.setUser_Name("admin"); adminUser.setUserId("0"); projectModel.setAdminUser(adminUser); List<ProjectModel.User> userList = new ArrayList<>(); ProjectModel.User user3 = new ProjectModel.User(); user3.setUserId("3"); user3.setUser_Name("name3"); userList.add(user3); ProjectModel.User user2 = new ProjectModel.User(); user2.setUserId("2"); user2.setUser_Name("name2"); userList.add(user2); projectModel.setUserList(userList); return projectModel; }
執(zhí)行結果格式化后如下
{
"adminUser": {
"user-id": "0",
"user_Name": "admin"
},
"projectId": 999,
"projectName": "p-1",
"userBeanList": [
{
"user-id": "3",
"user_Name": "name3"
},
{
"user-id": "2",
"user_Name": "name2"
}
],
"userIdList": [
"3",
"2",
"1"
]
}
注意看,(防盜連接:本文首發(fā)自)如果model類字段設置了JSONField注解的話,則優(yōu)先級最高,如果未設置該注解的話,則按照model類中字段的名稱進行設置。而基本類型、復雜類型、復雜類型容器等場景均支持。
場景二、Model對象轉Json字符串
新增代碼如下:
@PostConstruct public void handleJson2() { String newSourceJson="{\"projectId\":999,\"projectName\":\"p-1\"," + "\"userBeanList\":[{\"userId\":\"3\",\"user_Name\":\"name3\"},{\"user-id\":\"2\"," + "\"user_Name\":\"name2\"}],\"userIdList\":[\"3\",\"2\",\"1\"]}"; ProjectModel newProject = JSONObject.parseObject(newSourceJson, ProjectModel.class); String newProjectJson = JSON.toJSONString(newProject); System.out.println(newSourceJson); System.out.println(newProjectJson); }
Json串我們使用場景1的輸出,但是稍作修改:刪掉adminUser,同時注意userBeanList容器中的元素,兩個id的key不一樣,一個叫做userId(類字段名),一個叫做user-id(JSONField的name值)。然后再將對象轉為Json串,用這兩個Json串進行比較:
經過轉換后,userId字段消失了,這是由于null值不會被序列化出來的緣故。也從側面證明了反序列化時,如果@JSONField存在的話,必須要與@JSONField值保持一致,否則字段值不會寫入。如圖:
另外我們補充一個特殊情況情況,Model對象的字段為null轉Json串時,如何保留null值:(防盜連接:本文首發(fā)自)
注意第8行的轉換增加了參數SerializerFeature.WriteMapNullValue
@PostConstruct public void handleJson3() { String newSourceJson="{\"projectId\":999,\"projectName\":\"p-1\"," + "\"userBeanList\":[{\"userId\":\"3\",\"user_Name\":\"name3\"},{\"user-id\":\"2\"," + "\"user_Name\":\"name2\"}],\"userIdList\":[\"3\",\"2\",\"1\"]}"; ProjectModel newProject = JSONObject.parseObject(newSourceJson, ProjectModel.class); String newProjectJson=JSON.toJSONString(newProject, SerializerFeature.WriteMapNullValue); System.out.println(newSourceJson); System.out.println(newProjectJson); }
效果如下,生成的json串會保留null字段
到此這篇關于Springboot通過FastJson實現bean對象和Json字符串互轉的文章就介紹到這了,更多相關SpringbootFastJson實現bean和Json互轉內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Springboot整合ActiveMQ實現消息隊列的過程淺析
昨天仔細研究了activeMQ消息隊列,也遇到了些坑,下面這篇文章主要給大家介紹了關于SpringBoot整合ActiveMQ的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-02-02