Java中JSON字符串進(jìn)行各種轉(zhuǎn)換的方法小結(jié)
Gson和Hutool的JSONUtil都是常用的用于處理JSON數(shù)據(jù)的工具庫(kù),它們提供了簡(jiǎn)單易用的API來(lái)進(jìn)行JSON字符串的解析、轉(zhuǎn)換和操作。下面對(duì)它們進(jìn)行一些比較:
- 功能豐富程度: Gson相對(duì)來(lái)說(shuō)是一個(gè)更全面的JSON處理庫(kù),提供了更多的功能和選項(xiàng),例如支持自定義序列化和反序列化規(guī)則、處理復(fù)雜對(duì)象等。而Hutool的JSONUtil則是Hutool工具庫(kù)中的一部分,相對(duì)較為簡(jiǎn)潔,提供了一些基本的JSON操作方法。
- 使用方式: Gson使用起來(lái)比較簡(jiǎn)單明了,只需創(chuàng)建Gson對(duì)象,并通過(guò)其提供的方法進(jìn)行序列化和反序列化操作。而Hutool的JSONUtil也非常易用,可以直接調(diào)用其提供的方法進(jìn)行JSON字符串的解析、轉(zhuǎn)換和操作。
- 性能: 在性能方面,Gson通常比Hutool的JSONUtil稍微快一些。這是由于Gson在內(nèi)部使用了很多高級(jí)的技術(shù)和優(yōu)化策略來(lái)提高效率,但在大多數(shù)情況下,性能差異并不會(huì)對(duì)應(yīng)用程序產(chǎn)生顯著影響。
- 依賴和引入: Gson是Google開(kāi)發(fā)的庫(kù),需要單獨(dú)引入Gson的依賴包。而Hutool是一個(gè)Java工具庫(kù),JSONUtil是其中的一個(gè)模塊,可以通過(guò)引入整個(gè)Hutool工具庫(kù)來(lái)使用。
在使用選擇方面,如果你需要更多高級(jí)的JSON操作和自定義功能,或者對(duì)性能有較高要求,那么可以選擇使用Gson。而如果你只需要進(jìn)行一些基本的JSON解析、轉(zhuǎn)換和操作,并且希望使用一個(gè)輕量級(jí)的工具庫(kù),那么Hutool的JSONUtil是一個(gè)很好的選擇。最終選擇取決于你的具體需求和偏好。
1.GSON解析器
Gson 是一個(gè)開(kāi)源的 Java 庫(kù),用于在 Java 對(duì)象和 JSON 數(shù)據(jù)之間進(jìn)行序列化和反序列化操作。它可以將 Java 對(duì)象轉(zhuǎn)換為 JSON 字符串,并將 JSON 字符串轉(zhuǎn)換為 Java 對(duì)象。 可以將字符串轉(zhuǎn)換為復(fù)雜的bean,
導(dǎo)入依賴
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.6</version> </dependency>
準(zhǔn)備需要轉(zhuǎn)換成的實(shí)體類
@Data public class User{ private Integer id; private String name; private String sex; }
1.字符串轉(zhuǎn)javaBean對(duì)象
String str="{\"id\":1,\"name\":\"Lily\",\"sex\":\"女\"}"; Gson gson = new Gson(); User user = gson.fromJson(str, User.class);
使用 gson.fromJson()
方法將 JSON 字符串 str
轉(zhuǎn)換為 User 對(duì)象,并將結(jié)果存儲(chǔ)在 user
變量中。
注意,User
類需要與 JSON 字符串中的鍵值對(duì)對(duì)應(yīng),即 name
屬性對(duì)應(yīng) JSON 中的 "name"
鍵,age
屬性對(duì)應(yīng) JSON 中的 "age"
鍵。
2.字符串轉(zhuǎn)List
String strList="[{\"id\":1,\"name\":\"Lily\",\"sex\":\"女\"},{\"id\":2,\"name\":\"Bob\",\"sex\":\"男\(zhòng)"}]"; Gson gson = new Gson(); List<User> users = gson.fromJson(strList, new TypeToken<List<User>>() { }.getType());
此方法參數(shù)中的Type類型可以通過(guò)Gson包提供TypeToken<>類獲取。這個(gè)類帶有泛型,且這個(gè)泛型就是Json串轉(zhuǎn)換成為對(duì)象后的類型(此處是List<User>)我們不需要重寫(xiě)這個(gè)類中的任何方法,只需要?jiǎng)?chuàng)建這個(gè)類的一個(gè)匿名內(nèi)部類并調(diào)用getTpye()方法即可。
注意:需要轉(zhuǎn)換的字符串strList,必須是list格式,以"["開(kāi)頭,"]"結(jié)尾。不然會(huì)報(bào)錯(cuò):com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 1 path $
3.字符串轉(zhuǎn)map
與轉(zhuǎn)換為L(zhǎng)ist步驟一樣,注意:字符串需以"{"開(kāi)頭。
String strList="{\"id\":1,\"name\":\"Lily\",\"sex\":\"女\"}"; Gson gson = new Gson(); Map<String, Person> jsonMap = gson.fromJson(mapJson, new TypeToken<Map<String, Person>>() { }.getType());
4.Object轉(zhuǎn)換為JSON字符串
String json = gson.toJson(Object);
使用 gson.toJson()
方法將 各種Java 對(duì)象轉(zhuǎn)換成相應(yīng)的 JSON 字符串。
2.JSONUtil解析
JSONUtil 是 Hutool 中用于處理 JSON 數(shù)據(jù)的工具類。
導(dǎo)入依賴
<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-json</artifactId> <version>5.7.6</version> </dependency>
1.Object轉(zhuǎn)換為JSON字符串
JSONUtil.toJsonStr可以將任意對(duì)象(Bean、Map、集合等)直接轉(zhuǎn)換為JSON字符串。 如果對(duì)象是有序的Map等對(duì)象,則轉(zhuǎn)換后的JSON字符串也是有序的。
String jsonStr = JSONUtil.toJsonStr(Object);
2.JSON字符串轉(zhuǎn)換為map
首先使用 JSONUtil.parseObj()
方法將 JSON 字符串解析為一個(gè) JSONObject 對(duì)象,然后使用 toBean()
方法將 JSONObject 對(duì)象轉(zhuǎn)換為 HashMap 類型的 Java 對(duì)象。
String str="{\"id\":1,\"name\":\"Lily\",\"sex\":\"女\"}"; JSONObject jsonObject = JSONUtil.parseObj(str); HashMap map = jsonObject.toBean(HashMap.class);
3.JSON字符串轉(zhuǎn)換為L(zhǎng)ist
1.使用 JSONArray.parseArray() 方法將 JSON 字符串轉(zhuǎn)換為 JSONArray 對(duì)象; 使用 JSONArray.toList() 方法將 JSONArray 對(duì)象轉(zhuǎn)換為 List 對(duì)象
String jsonString = "[{\"id\": 1, \"name\": \"Alice\"}, {\"id\": 2, \"name\": \"Bob\"}]"; JSONArray jsonArray = JSONUtil.parseArray(jsonString); List<Map<String, Object>> list = CollectionUtil.toList(jsonArray, Map.class);
2.JSONUtil.toList()
方法需要傳入兩個(gè)參數(shù):一個(gè)JsonArray,一個(gè)要轉(zhuǎn)換的類型,這里new一個(gè)JsonArray
JSONArray jsonArray = new JSONArray(jsonList); List<Map> mapList = JSONUtil.toList(jsonArray, Map.class);
3.總結(jié)
1.GSON
Object轉(zhuǎn)換為json字符串:gson.toJson(Object)
json字符串轉(zhuǎn)Object: gson.fromJson(strList, new TypeToken<>() { }.getType());
2.JSONUtil
Object轉(zhuǎn)換為json字符串:JSONUtil.toJsonStr(Object)
json字符串轉(zhuǎn)map:
HashMap<String,Integer> hashMap = JSONUtil.parseObj(jsonMap).toBean(HashMap.class);
json字符串轉(zhuǎn)list:
JSONArray jsonArray = new JSONArray(objListJson); List users = JSONUtil.toList(jsonArray, User.class);
或者:
JSONArray jsonArray = JSONUtil.parseArray(jsonString); List list = CollectionUtil.toList(jsonArray, User.class);
以上就是Java中JSON字符串進(jìn)行各種轉(zhuǎn)換的方法小結(jié)的詳細(xì)內(nèi)容,更多關(guān)于Java JSON字符串轉(zhuǎn)換的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java 入門(mén)圖形用戶界面設(shè)計(jì)之單選按鈕
圖形界面(簡(jiǎn)稱GUI)是指采用圖形方式顯示的計(jì)算機(jī)操作用戶界面。與早期計(jì)算機(jī)使用的命令行界面相比,圖形界面對(duì)于用戶來(lái)說(shuō)在視覺(jué)上更易于接受,本篇精講Java語(yǔ)言中關(guān)于圖形用戶界面的單選按鈕2022-02-02java+mysql實(shí)現(xiàn)登錄和注冊(cè)功能
這篇文章主要為大家詳細(xì)介紹了java+mysql實(shí)現(xiàn)登錄和注冊(cè)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04詳解springboot啟動(dòng)時(shí)是如何加載配置文件application.yml文件
這篇文章主要介紹了詳解springboot啟動(dòng)時(shí)是如何加載配置文件application.yml文件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06SpringBoot基于Redis的分布式鎖實(shí)現(xiàn)過(guò)程記錄
Redis是一套 key-value 高性能數(shù)據(jù)庫(kù),使用它可以大大提高我們的開(kāi)發(fā)效率,在SpringBoot中,自動(dòng)配置也幫我們節(jié)約了大量的配置,下面這篇文章主要給大家介紹了關(guān)于SpringBoot基于Redis的分布式鎖實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2022-01-01Springboot關(guān)于自定義stater的yml無(wú)法提示問(wèn)題解決方案
這篇文章主要介紹了Springboot關(guān)于自定義stater的yml無(wú)法提示問(wèn)題及解決方案,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06springboot實(shí)現(xiàn)發(fā)送郵件(QQ郵箱為例)
這篇文章主要為大家詳細(xì)介紹了springboot實(shí)現(xiàn)發(fā)送郵件,qq郵箱代碼實(shí)現(xiàn)郵件發(fā)送,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06超詳細(xì)介紹idea中java程序打jar包的兩種方式
這篇文章主要介紹了超詳細(xì)介紹idea中java程序打jar包的兩種方式一種是可直接執(zhí)行的runnable jar文件,另一種是包含多個(gè)主類,運(yùn)行時(shí)需要指定主類全類名的jar包,感興趣的可以了解一下2020-07-07解決Java執(zhí)行Cmd命令出現(xiàn)的死鎖問(wèn)題
這篇文章主要介紹了關(guān)于Java執(zhí)行Cmd命令出現(xiàn)的死鎖問(wèn)題解決,解決方法就是在waitfor()方法之前讀出窗口的標(biāo)準(zhǔn)輸出、輸出、錯(cuò)誤緩沖區(qū)中的內(nèi)容,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07