詳解JSON與?Java對(duì)象之間的轉(zhuǎn)化
前言
在現(xiàn)在的日常開發(fā)中,不管前端還是后端,JSON 格式的數(shù)據(jù)是用得比較多的,甚至可以說(shuō)無(wú)處不在。
接觸最多的就是 POST 請(qǐng)求中傳遞的數(shù)據(jù)一般以 JSON 的格式放在請(qǐng)求體中,而且服務(wù)端各種 API 返回的數(shù)據(jù),在響應(yīng)體中也基本都是以 JSON 格式的數(shù)據(jù)進(jìn)行返回的,這也是 RESTful 風(fēng)格的體現(xiàn)之一。
當(dāng)然,不止是請(qǐng)求與響應(yīng)的過(guò)程中使用到 JSON,在某些業(yè)務(wù)場(chǎng)景下也是需要用到 JSON 的,特別是 JSON 與 Java 對(duì)象之間的轉(zhuǎn)化。
所以,對(duì)于 Java 開發(fā)的我們來(lái)說(shuō),JSON 格式的數(shù)據(jù)與 Java 對(duì)象之間的轉(zhuǎn)化是必會(huì)的。
轉(zhuǎn)化的工具
主流的轉(zhuǎn)化工具有如下幾種,一般項(xiàng)目中建議只選其中一種,目前好評(píng)最多的感覺(jué)就是 Jackson 了。
- Jackson
- FastJson
- Gson
- Hutool
準(zhǔn)備的 JSON 字符串和 List
為了方便演示,這里給出一個(gè) JSON 字符串:
String jsonStr = "{\"name\" : \"GTA5\", \"price\" : 54.5}";
這里給出一個(gè) List<Game>
:
Game game1 = Game.builder().name("NBA2K23").price(new BigDecimal("198.0")).build(); Game game2 = Game.builder().name("Sim City4").price(new BigDecimal("22.5")).build(); List<Game> gameList = new ArrayList<>(); gameList.add(game1); gameList.add(game2);
Jackson
我們需要借助 Jackson 提供的 ObjectMapper
對(duì)象來(lái)完成轉(zhuǎn)化:
ObjectMapper objectMapper = new ObjectMapper();
將 JSON 字符串 轉(zhuǎn)成 Java 對(duì)象:readValue
使用 readValue
方法,第一個(gè)參數(shù)是 JSON 字符串,第二個(gè)參數(shù)是轉(zhuǎn)化的目標(biāo)類的類型。
// 將 JSON 字符串 轉(zhuǎn)成 Java 對(duì)象 Game game = objectMapper.readValue(jsonStr, Game.class);
將 Java 對(duì)象轉(zhuǎn)成 JSON 字符串:writeValueAsString
使用 writeValueAsString
方法,接受一個(gè) Java 對(duì)象,返回一個(gè) JSON 字符串。
// 將 Java 對(duì)象轉(zhuǎn)成 JSON 字符串 String gameJson = objectMapper.writeValueAsString(game);
將 List 轉(zhuǎn)成 JSON 字符串:writeValueAsString
同樣使用 writeValueAsString
方法。
// 將 List<Game> 轉(zhuǎn)成 JSON 字符串 String gameListJson = objectMapper.writeValueAsString(gameList);
將 JSON 字符串 轉(zhuǎn)成 List:readValue
使用 readValue
方法,第一個(gè)參數(shù)是 JSON 字符串,第二個(gè)參數(shù)是轉(zhuǎn)化的目標(biāo) TypeReference(類型參照)對(duì)象,這里指定其泛型為 List<Game>
。
// 將 JSON 字符串 轉(zhuǎn)成 List<Game> List<Game> gameListFromJson = objectMapper.readValue(gameListJson, new TypeReference<List<Game>>() {});
總結(jié)
從 JSON 到 Java 對(duì)象,使用 readValue
方法。
從 Java 對(duì)象到 JSON,使用 writeValueAsString
方法。
FastJson
我們需要借助 FastJson 提供的 JSONObject
對(duì)象來(lái)完成轉(zhuǎn)化。
將 JSON 字符串 轉(zhuǎn)成 Java 對(duì)象:parseObject
使用 parseObject
方法,將 JSON 字符串解析(轉(zhuǎn)化)成 Java 對(duì)象,第一個(gè)參數(shù)是 JSON 字符串,第二個(gè)參數(shù)是目標(biāo)類的類型。
// 將 JSON 字符串 轉(zhuǎn)成 Java 對(duì)象 Game game = JSONObject.parseObject(jsonStr, Game.class);
將 Java 對(duì)象轉(zhuǎn)成 JSON 字符串:toJSONString
使用 toJSONString
方法,將 Java 對(duì)象直接轉(zhuǎn)成 JSON 字符串,接受一個(gè) Java 對(duì)象,返回對(duì)應(yīng)的 JSON 字符串。
// 將 Java 對(duì)象轉(zhuǎn)成 JSON 字符串 String gameJson = JSONObject.toJSONString(game);
將 List 轉(zhuǎn)成 JSON 字符串:toJSONString
同理,可以直接丟一個(gè) List 對(duì)象給 toJSONString
方法,把 List 轉(zhuǎn)成 JSON 字符串。
// 將 List<Game> 轉(zhuǎn)成 JSON 字符串 String gameListJson = JSONObject.toJSONString(gameList);
將 JSON 字符串 轉(zhuǎn)成 List:parseArray
使用 parseArray
方法,將 JSON 字符串解析成 List。2.0 版本需要調(diào)用 toJavaList
方法,得到最后的 List
// 將 JSON 字符串 轉(zhuǎn)成 List<Game> // fastjson 1.2.x 版本:List<Game> gameListFromJson = JSONObject.parseArray(gameListJson, Game.class); List<Game> gameListFromJson = JSONArray.parseArray(gameListJson).toJavaList(Game.class);
總結(jié)
JSON 轉(zhuǎn)成 Java Bean 使用 parseObject
方法,轉(zhuǎn)成 List 使用 parseArray
方法。
任意對(duì)象轉(zhuǎn)成 JSON,則使用 toJSONString
方法。
Gson
我們需要借助 Gson
對(duì)象來(lái)完成轉(zhuǎn)化:
Gson gson = new Gson();
將 JSON 字符串 轉(zhuǎn)成 Java 對(duì)象:fromJson
使用 fromJson
方法,兩個(gè)參數(shù)的定義也是和上面兩個(gè)一樣的。
// 將 JSON 字符串 轉(zhuǎn)成 Java 對(duì)象 Game game = gson.fromJson(jsonStr, Game.class);
將 Java 對(duì)象轉(zhuǎn)成 JSON 字符串:toJson
使用 toJson
方法,接受一個(gè) Java 對(duì)象,然后返回對(duì)應(yīng)的 JSON 字符串。
// 將 Java 對(duì)象轉(zhuǎn)成 JSON 字符串 String gameJson = gson.toJson(game);
將 List 轉(zhuǎn)成 JSON 字符串:toJson
List 也是同理,使用 toJson
方法。
// 將 List<Game> 轉(zhuǎn)成 JSON 字符串 String gameListJson = gson.toJson(gameList);
將 JSON 字符串 轉(zhuǎn)成 List:fromJson
這里和 Jackson 的也是類似,第二個(gè)參數(shù)使用 TypeToken
對(duì)象指定轉(zhuǎn)化的目標(biāo)類型為 List<Game>
。
// 將 JSON 字符串 轉(zhuǎn)成 List<Game> List<Game> gameListFromJson = gson.fromJson(gameListJson, new TypeToken<List<Game>>() {}.getType());
總結(jié)
從 JSON 到 Java 對(duì)象,使用 fromJson
方法。
從 Java 對(duì)象到 JSON,使用 toJson
方法。
Hutool
我們需要借助 Hutool 提供的 JSONUtil
對(duì)象來(lái)完成轉(zhuǎn)化。
將 JSON 字符串 轉(zhuǎn)成 Java 對(duì)象:toBean
使用 toBean
方法,還是同樣的,接受的兩個(gè)參數(shù),一個(gè)字符串,一個(gè)目標(biāo)類的類型。
// 將 JSON 字符串 轉(zhuǎn)成 Java 對(duì)象 Game game = JSONUtil.toBean(jsonStr, Game.class);
將 Java 對(duì)象轉(zhuǎn)成 JSON 字符串:toJsonStr
使用 toJsonStr
方法,接受一個(gè) Java 對(duì)象,返回一個(gè) JSON 字符串。
// 將 Java 對(duì)象轉(zhuǎn)成 JSON 字符串 String gameJson = JSONUtil.toJsonStr(game);
將 List 轉(zhuǎn)成 JSON 字符串:toJsonStr
同理,也是 toJsonStr
方法。
// 將 List<Game> 轉(zhuǎn)成 JSON 字符串 String gameListJson = JSONUtil.toJsonStr(gameList);
將 JSON 字符串 轉(zhuǎn)成 List:toList
使用 toList
方法,和 toBean
方法接受的參數(shù)一樣。
// 將 JSON 字符串 轉(zhuǎn)成 List<Game> List<Game> gameListFromJson = JSONUtil.toList(gameListJson, Game.class);
總結(jié)
JSON 轉(zhuǎn)成 Java Bean 使用 toBean
方法,轉(zhuǎn)成 List 使用 toList
方法。
任意對(duì)象轉(zhuǎn)成 JSON,則使用 toJsonStr
方法。
到此這篇關(guān)于詳解JSON與 Java對(duì)象之間的轉(zhuǎn)化的文章就介紹到這了,更多相關(guān)JSON Java對(duì)象內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java中Map與JSON數(shù)據(jù)之間的互相轉(zhuǎn)化
- Java中Json與List、Map、entity的互相轉(zhuǎn)化
- java 將jsonarray 轉(zhuǎn)化為對(duì)應(yīng)鍵值的jsonobject方法
- Json轉(zhuǎn)化為Java對(duì)象的實(shí)例詳解
- json-lib將json格式的字符串,轉(zhuǎn)化為java對(duì)象的實(shí)例
- java中實(shí)體類和JSON對(duì)象之間相互轉(zhuǎn)化
- Java 中Json中既有對(duì)象又有數(shù)組的參數(shù)如何轉(zhuǎn)化成對(duì)象(推薦)
相關(guān)文章
詳談Java 異常處理的誤區(qū)和經(jīng)驗(yàn)總結(jié)(分享)
下面小編就為大家分享一篇Java 異常處理的誤區(qū)和經(jīng)驗(yàn)總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12eclipse里沒(méi)有“Dynamic Web Project“這個(gè)選項(xiàng)的問(wèn)題解決
本文主要介紹了eclipse里沒(méi)有“Dynamic Web Project“這個(gè)選項(xiàng)的問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08在Spring Boot中實(shí)現(xiàn)HTTP緩存的方法
緩存是HTTP協(xié)議的一個(gè)強(qiáng)大功能,但由于某些原因,它主要用于靜態(tài)資源,如圖像,CSS樣式表或JavaScript文件。本文重點(diǎn)給大家介紹在Spring Boot中實(shí)現(xiàn)HTTP緩存的方法,感興趣的朋友跟隨小編一起看看吧2018-10-10Java使用POI實(shí)現(xiàn)導(dǎo)出Excel的方法詳解
在項(xiàng)目開發(fā)中往往需要使用到Excel的導(dǎo)入和導(dǎo)出,導(dǎo)入就是從Excel中導(dǎo)入到DB中,而導(dǎo)出就是從DB中查詢數(shù)據(jù)然后使用POI寫到Excel上。本文將利用POI實(shí)現(xiàn)導(dǎo)出Excel,需要的可以參考一下2022-10-10java編程實(shí)現(xiàn)郵件定時(shí)發(fā)送的方法
這篇文章主要介紹了java編程實(shí)現(xiàn)郵件定時(shí)發(fā)送的方法,涉及Java基于定時(shí)器實(shí)現(xiàn)計(jì)劃任務(wù)的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11詳解Springboot應(yīng)用啟動(dòng)以及關(guān)閉時(shí)完成某些操作
這篇文章主要介紹了詳解Springboot應(yīng)用啟動(dòng)以及關(guān)閉時(shí)完成某些操作,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11spring cloud 使用Zuul 實(shí)現(xiàn)API網(wǎng)關(guān)服務(wù)問(wèn)題
這篇文章主要介紹了spring cloud 使用Zuul 實(shí)現(xiàn)API網(wǎng)關(guān)服務(wù)問(wèn)題,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-05-05