Springboot?通過(guò)FastJson實(shí)現(xiàn)bean對(duì)象和Json字符串互轉(zhuǎn)問(wèn)題
Json格式在后臺(tái)服務(wù)中的重要性就不多說(shuō)了,直入正題。
首先引入pom文件,這里使用的是1.2.83版本
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>接著我們嘗試驗(yàn)證兩種場(chǎng)景
1、Model對(duì)象轉(zhuǎn)Json字符串
2、Json字符串轉(zhuǎn)Model對(duì)象
在驗(yàn)證之前我們需要先編寫(xiě)一個(gè)model類(lèi),這個(gè)model類(lèi)的字段我們可以使用fastJson中的注解@JSONField來(lái)修飾,并添加name值。
這個(gè)注解的作用,將該model類(lèi)的字段和對(duì)應(yīng)的json對(duì)象的key相對(duì)應(yīng)起來(lái)。(防盜連接:本文首發(fā)自 )
當(dāng)然你也可以不添加該注解,這樣就相當(dāng)于使用了字段名稱(chēng)本身與json對(duì)象的key建立映射。
為了盡可能的展示各種場(chǎng)景,我在下邊的model 示例中,使用了好幾種場(chǎng)景
1、注解的name值與字段值相同
2、注解的name值與字段值不同
3、不設(shè)置注解
4、作用在復(fù)雜引用類(lèi)型上
5、作用在基本類(lèi)型上
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;
}
}接下來(lái)我們開(kāi)始驗(yàn)證:
場(chǎng)景一、Model對(duì)象轉(zhuǎn)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í)行結(jié)果格式化后如下
{
"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類(lèi)字段設(shè)置了JSONField注解的話(huà),則優(yōu)先級(jí)最高,如果未設(shè)置該注解的話(huà),則按照model類(lèi)中字段的名稱(chēng)進(jìn)行設(shè)置。而基本類(lèi)型、復(fù)雜類(lèi)型、復(fù)雜類(lèi)型容器等場(chǎng)景均支持。
場(chǎng)景二、Model對(duì)象轉(zhuǎn)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串我們使用場(chǎng)景1的輸出,但是稍作修改:刪掉adminUser,同時(shí)注意userBeanList容器中的元素,兩個(gè)id的key不一樣,一個(gè)叫做userId(類(lèi)字段名),一個(gè)叫做user-id(JSONField的name值)。然后再將對(duì)象轉(zhuǎn)為Json串,用這兩個(gè)Json串進(jìn)行比較:

經(jīng)過(guò)轉(zhuǎn)換后,userId字段消失了,這是由于null值不會(huì)被序列化出來(lái)的緣故。也從側(cè)面證明了反序列化時(shí),如果@JSONField存在的話(huà),必須要與@JSONField值保持一致,否則字段值不會(huì)寫(xiě)入。如圖:

另外我們補(bǔ)充一個(gè)特殊情況情況,Model對(duì)象的字段為null轉(zhuǎn)Json串時(shí),如何保留null值:(防盜連接:本文首發(fā)自)
注意第8行的轉(zhuǎn)換增加了參數(shù)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串會(huì)保留null字段

到此這篇關(guān)于Springboot通過(guò)FastJson實(shí)現(xiàn)bean對(duì)象和Json字符串互轉(zhuǎn)的文章就介紹到這了,更多相關(guān)SpringbootFastJson實(shí)現(xiàn)bean和Json互轉(zhuǎn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring?boot+vue實(shí)現(xiàn)JSAPI微信支付的完整步驟
JSAPI支付是用戶(hù)在微信中打開(kāi)商戶(hù)的H5頁(yè)面,商戶(hù)在H5頁(yè)面通過(guò)調(diào)用微信支付提供的JSAPI接口調(diào)起微信支付模塊完成支付,下面這篇文章主要給大家介紹了關(guān)于spring?boot+vue實(shí)現(xiàn)JSAPI微信支付的相關(guān)資料,需要的朋友可以參考下2022-05-05
JAVA熔斷和降級(jí)真實(shí)關(guān)系的圖文詳解
這篇文章主要介紹了Java熔斷和降級(jí)的關(guān)系,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09
JVM---jstack分析Java線(xiàn)程CPU占用,線(xiàn)程死鎖的解決
這篇文章主要介紹了JVM---jstack分析Java線(xiàn)程CPU占用,線(xiàn)程死鎖的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
Java的Cglib動(dòng)態(tài)代理實(shí)現(xiàn)方式詳解
這篇文章主要介紹了Java的Cglib動(dòng)態(tài)代理實(shí)現(xiàn)方式詳解,CGLIB是強(qiáng)大的、高性能的代碼生成庫(kù),被廣泛應(yīng)用于AOP框架,它底層使用ASM來(lái)操作字節(jié)碼生成新的類(lèi),為對(duì)象引入間接級(jí)別,以控制對(duì)象的訪(fǎng)問(wèn),需要的朋友可以參考下2023-11-11
SpringBoot使用DevTools實(shí)現(xiàn)后端熱部署的過(guò)程詳解
在Spring Boot項(xiàng)目中,Spring Boot官方提供你了Devtools熱部署模塊,通過(guò)maven的方式導(dǎo)入就能使用,本文主要SpringBoot通過(guò)DevTools實(shí)現(xiàn)熱部署,感興趣的朋友一起看看吧2023-11-11
快速掌握SpringBoot應(yīng)用的啟動(dòng)入口
本篇并不是深究?jī)?nèi)置服務(wù)器的啟動(dòng)過(guò)程,而是追溯Springboot啟動(dòng)之前到底做了什么?它是如何與我們經(jīng)常寫(xiě)的@SpringBootApplication注解注釋的main方法類(lèi)綁定起來(lái)的?對(duì)SpringBoot啟動(dòng)入口相關(guān)知識(shí)感興趣的朋友一起看看吧2022-05-05
如何解決SpringBoot2.x版本對(duì)Velocity模板不支持的方案
這篇文章主要介紹了如何解決SpringBoot2.x版本對(duì)Velocity模板不支持的方案,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-12-12

