JSON 與 Java 對象之間的轉化

来源:https://www.cnblogs.com/god23bin/archive/2023/03/27/json-to-java.html
-Advertisement-
Play Games

在現在的日常開發中,不管前端還是後端,JSON 格式的數據是用得比較多的,甚至可以說無處不在。在某些業務場景下也是需要用到 JSON 的,特別是 JSON 與 Java 對象之間的轉化。 ...


前言

在現在的日常開發中,不管前端還是後端,JSON 格式的數據是用得比較多的,甚至可以說無處不在。

接觸最多的就是 POST 請求中傳遞的數據一般以 JSON 的格式放在請求體中,而且服務端各種 API 返回的數據,在響應體中也基本都是以 JSON 格式的數據進行返回的,這也是 RESTful 風格的體現之一。

當然,不止是請求與響應的過程中使用到 JSON,在某些業務場景下也是需要用到 JSON 的,特別是 JSON 與 Java 對象之間的轉化

所以,對於 Java 開發的我們來說,JSON 格式的數據與 Java 對象之間的轉化是必會的。

轉化的工具

主流的轉化工具有如下幾種,一般項目中建議只選其中一種,目前好評最多的感覺就是 Jackson 了。

  • Jackson

  • FastJson

  • Gson

  • Hutool

準備的 JSON 字元串和 List

為了方便演示,這裡給出一個 JSON 字元串:

String jsonStr = "{\"name\" : \"GTA5\", \"price\" : 54.5}";

這裡給出一個 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 對象來完成轉化:

ObjectMapper objectMapper = new ObjectMapper();

將 JSON 字元串 轉成 Java 對象:readValue

使用 readValue 方法,第一個參數是 JSON 字元串,第二個參數是轉化的目標類的類型。

// 將 JSON 字元串 轉成 Java 對象
Game game = objectMapper.readValue(jsonStr, Game.class);

將 Java 對象轉成 JSON 字元串:writeValueAsString

使用 writeValueAsString 方法,接受一個 Java 對象,返回一個 JSON 字元串。

// 將 Java 對象轉成 JSON 字元串
String gameJson = objectMapper.writeValueAsString(game);

將 List 轉成 JSON 字元串:writeValueAsString

同樣使用 writeValueAsString 方法。

// 將 List<Game> 轉成 JSON 字元串
String gameListJson = objectMapper.writeValueAsString(gameList);

將 JSON 字元串 轉成 List:readValue

使用 readValue 方法,第一個參數是 JSON 字元串,第二個參數是轉化的目標 TypeReference(類型參照)對象,這裡指定其泛型為 List<Game>

// 將 JSON 字元串 轉成 List<Game>
List<Game> gameListFromJson = objectMapper.readValue(gameListJson, new TypeReference<List<Game>>() {});

總結

從 JSON 到 Java 對象,使用 readValue 方法。

從 Java 對象到 JSON,使用 writeValueAsString 方法。

FastJson

我們需要藉助 FastJson 提供的 JSONObject 對象來完成轉化。

將 JSON 字元串 轉成 Java 對象:parseObject

使用 parseObject 方法,將 JSON 字元串解析(轉化)成 Java 對象,第一個參數是 JSON 字元串,第二個參數是目標類的類型。

// 將 JSON 字元串 轉成 Java 對象
Game game = JSONObject.parseObject(jsonStr, Game.class);

將 Java 對象轉成 JSON 字元串:toJSONString

使用 toJSONString 方法,將 Java 對象直接轉成 JSON 字元串,接受一個 Java 對象,返回對應的 JSON 字元串。

// 將 Java 對象轉成 JSON 字元串
String gameJson = JSONObject.toJSONString(game);

將 List 轉成 JSON 字元串:toJSONString

同理,可以直接丟一個 List 對象給 toJSONString 方法,把 List 轉成 JSON 字元串。

// 將 List<Game> 轉成 JSON 字元串
String gameListJson = JSONObject.toJSONString(gameList);

將 JSON 字元串 轉成 List:parseArray

使用 parseArray 方法,將 JSON 字元串解析成 List。2.0 版本需要調用 toJavaList 方法,得到最後的 List

// 將 JSON 字元串 轉成 List<Game>
// fastjson 1.2.x 版本:List<Game> gameListFromJson = JSONObject.parseArray(gameListJson, Game.class);
List<Game> gameListFromJson = JSONArray.parseArray(gameListJson).toJavaList(Game.class);

總結

JSON 轉成 Java Bean 使用 parseObject 方法,轉成 List 使用 parseArray 方法。

任意對象轉成 JSON,則使用 toJSONString 方法。

Gson

我們需要藉助 Gson 對象來完成轉化:

Gson gson = new Gson();

將 JSON 字元串 轉成 Java 對象:fromJson

使用 fromJson 方法,兩個參數的定義也是和上面兩個一樣的。

// 將 JSON 字元串 轉成 Java 對象
Game game = gson.fromJson(jsonStr, Game.class);

將 Java 對象轉成 JSON 字元串:toJson

使用 toJson 方法,接受一個 Java 對象,然後返回對應的 JSON 字元串。

// 將 Java 對象轉成 JSON 字元串
String gameJson = gson.toJson(game);

將 List 轉成 JSON 字元串:toJson

List 也是同理,使用 toJson 方法。

// 將 List<Game> 轉成 JSON 字元串
String gameListJson = gson.toJson(gameList);

將 JSON 字元串 轉成 List:fromJson

這裡和 Jackson 的也是類似,第二個參數使用 TypeToken 對象指定轉化的目標類型為 List<Game>

// 將 JSON 字元串 轉成 List<Game>
List<Game> gameListFromJson = gson.fromJson(gameListJson, new TypeToken<List<Game>>() {}.getType());

總結

從 JSON 到 Java 對象,使用 fromJson 方法。

從 Java 對象到 JSON,使用 toJson 方法。

Hutool

我們需要藉助 Hutool 提供的 JSONUtil 對象來完成轉化。

將 JSON 字元串 轉成 Java 對象:toBean

使用 toBean 方法,還是同樣的,接受的兩個參數,一個字元串,一個目標類的類型。

// 將 JSON 字元串 轉成 Java 對象
Game game = JSONUtil.toBean(jsonStr, Game.class);

將 Java 對象轉成 JSON 字元串:toJsonStr

使用 toJsonStr 方法,接受一個 Java 對象,返回一個 JSON 字元串。

// 將 Java 對象轉成 JSON 字元串
String gameJson = JSONUtil.toJsonStr(game);

將 List 轉成 JSON 字元串:toJsonStr

同理,也是 toJsonStr 方法。

// 將 List<Game> 轉成 JSON 字元串
String gameListJson = JSONUtil.toJsonStr(gameList);

將 JSON 字元串 轉成 List:toList

使用 toList 方法,和 toBean 方法接受的參數一樣。

// 將 JSON 字元串 轉成 List<Game>
List<Game> gameListFromJson = JSONUtil.toList(gameListJson, Game.class);

總結

JSON 轉成 Java Bean 使用 toBean 方法,轉成 List 使用 toList 方法。

任意對象轉成 JSON,則使用 toJsonStr 方法。

最後的最後

由本人水平所限,難免有錯誤以及不足之處, 屏幕前的靚仔靚女們 如有發現,懇請指出!

最後,謝謝你看到這裡,謝謝你認真對待我的努力,希望這篇博客對你有所幫助!

你輕輕地點了個贊,那將在我的心裡世界增添一顆明亮而耀眼的星!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 定義 定義一系列的演算法,將他們一個個封裝起來,使他們直接可以相互替換。 演算法:就是寫的邏輯可以是你任何一個功能函數的邏輯 封裝:就是把某一功能點對應的邏輯給抽出來 可替換:建立在封裝的基礎上,這些獨立的演算法可以很方便的替換 通俗的理解就是,把你的演算法(邏輯)封裝到不同的策略中,在不同的策略中是互相獨 ...
  • 訪問者模式(Visitor Pattern)是一種行為型設計模式,用於將操作與其所操作的對象分離開來。該模式的核心思想是將操作封裝在一個訪問者對象中,而不是分散在各個對象中。通過將操作與對象分離開來,訪問者模式可以在不修改對象結構的情況下,添加新的操作。 在前端開發中,訪問者模式通常用於處理DOM樹 ...
  • mounted: () { this.getList('', (data) => { console.log(data); }) } methods: { getList (condition) { get_list({...condition}).then(res => { if (res.dat ...
  • 在Vue $mount過程中,我們需要把模版編譯成render函數,整體實現可以分為三部分: parse、optimize、codegen。 ...
  • 1. 響應式編程 1.1. 使用基於事件的範式處理非同步數據流 1.2. 和非同步編程提供了相同的性能優勢 1.3. 能夠擴展程式(特別是擴展I/O)以處理很多連接和數據源 2. 非阻塞I/O 2.1. 有效擴展伺服器的基礎 2.2. 允許伺服器用相對較少的線程處理相對較多的連接 2.2.1. 傳統的服 ...
  • 關於商業認知 2022 年復盤了過去幾年的項目經歷:很多項目商業都沒開始就死了,能商業化閉環 & 能持續一段時間的一隻手數量都沒有。 從 2022 年幾個月陸續復盤中,收穫了不少商業相關心得: 心得:一定要選合適自己方向的項目 以前我對戰略、方向的思考是極少的,很容易陷入達克效應(鄧寧-克魯格效應) ...
  • 本文已經收錄到Github倉庫,該倉庫包含電腦基礎、Java基礎、多線程、JVM、資料庫、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分散式、微服務、設計模式、架構、校招社招分享等核心知識點,歡迎star~ Github地址 大家好,我是大彬~ 今天給大家分 ...
  • 使用 VLD 記憶體泄漏檢測工具輔助開發時整理的學習筆記。本篇介紹 VLD 配置文件中配置項 MaxDataDump 的使用方法。 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 插件化的需求主要源於對軟體架構靈活性的追求,特別是在開發大型、複雜或需要不斷更新的軟體系統時,插件化可以提高軟體系統的可擴展性、可定製性、隔離性、安全性、可維護性、模塊化、易於升級和更新以及支持第三方開發等方面的能力,從而滿足不斷變化的業務需求和技術挑戰。 一、插件化探索 在WPF中我們想要開 ...
  • 歡迎ReaLTaiizor是一個用戶友好的、以設計為中心的.NET WinForms項目控制項庫,包含廣泛的組件。您可以使用不同的主題選項對項目進行個性化設置,並自定義用戶控制項,以使您的應用程式更加專業。 項目地址:https://github.com/Taiizor/ReaLTaiizor 步驟1: ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • Channel 是乾什麼的 The System.Threading.Channels namespace provides a set of synchronization data structures for passing data between producers and consume ...
  • efcore如何優雅的實現按年分庫按月分表 介紹 本文ShardinfCore版本 本期主角: ShardingCore 一款ef-core下高性能、輕量級針對分表分庫讀寫分離的解決方案,具有零依賴、零學習成本、零業務代碼入侵適配 距離上次發文.net相關的已經有很久了,期間一直在從事java相關的 ...
  • 前言 Spacesniffer 是一個免費的文件掃描工具,通過使用樹狀圖可視化佈局,可以立即瞭解大文件夾的位置,幫助用戶處理找到這些文件夾 當前系統C盤空間 清理後系統C盤空間 下載 Spacesniffer 下載地址:https://spacesniffer.en.softonic.com/dow ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • 一、ReZero簡介 ReZero是一款.NET中間件 : 全網唯一開源界面操作就能生成API , 可以集成到任何.NET6+ API項目,無破壞性,也可讓非.NET用戶使用exe文件 免費開源:MIT最寬鬆協議 , 一直從事開源事業十年,一直堅持開源 1.1 純ReZero開發 適合.Net Co ...
  • 一:背景 1. 講故事 停了一個月沒有更新文章了,主要是忙於寫 C#內功修煉系列的PPT,現在基本上接近尾聲,可以回頭繼續更新這段時間分析dump的一些事故報告,有朋友微信上找到我,說他們的系統出現了大量的http超時,程式不響應處理了,讓我幫忙看下怎麼回事,dump也抓到了。 二:WinDbg分析 ...
  • 開始做項目管理了(本人3年java,來到這邊之後真沒想到...),天天開會溝通整理需求,他們講話的時候忙裡偷閑整理一下常用的方法,其實語言還是有共通性的,基本上看到方法名就大概能猜出來用法。出去打水的時候看到外面太陽好好,真想在外面坐著曬太陽,回來的時候好兄弟三年前送給我的鍵盤D鍵不靈了,在打"等待 ...