什么是JSON,如何與Java對象轉化

JSON概念

JSON (JavaScript Object Notation) 是一種輕量級的數據交換格式。它易于人閱讀和編寫,同時也易于機器解析和生成。JSON 基于 JavaScript(ECMAScript(歐洲計算機協會制定的js規范)) 編程語言的一個子集,但它是一種獨立于語言的數據格式,被廣泛應用于各種編程語言和平臺之間的數據交換。

JSON 的主要特點:

  • 輕量級: JSON 格式非常簡潔,只包含必要的數據信息,減少了傳輸的數據量,提高了數據傳輸效率。
  • 易于閱讀和編寫: JSON 的結構清晰,使用鍵值對的方式組織數據,易于人理解和編寫。
  • 易于解析和生成: 各種編程語言都提供了 JSON 解析器和生成器,方便程序處理 JSON 數據。
  • 跨平臺、跨語言: JSON 是一種與編程語言無關的數據格式,可以在不同的平臺和編程語言之間進行數據交換。
  • 數據結構: JSON 支持兩種基本的數據結構:
    • 對象(Object): 由花括號 {} 包圍,包含一系列鍵值對。鍵必須是字符串,值可以是基本數據類型(字符串、數字、布爾值、null)、數組或另一個 JSON 對象。
    • 數組(Array): 由方括號 [] 包圍,包含一系列值。值可以是基本數據類型(字符串、數字、布爾值、null)、JSON 對象或另一個數組。

JSON 的數據類型:

  • 字符串(String): 用雙引號 "" 包圍的 Unicode 字符序列。
  • 數字(Number): 可以是整數或浮點數。
  • 布爾值(Boolean): truefalse
  • 空值(Null): null
  • 對象(Object): 鍵值對的集合。
  • 數組(Array): 值的有序列表。

語法:

  1. 數據在 鍵值對(Key/Value) 中

  2. 數據由逗號 , 分隔

  3. 對象? {} 表?

  4. 數組? [] 表?

  5. 值可以為對象, 也可以為數組, 數組中可以包含多個對象

JSON 示例:

{"name": "張三","age": 30,"city": "北京","isStudent": false,"courses": ["語文", "數學", "英語"],"address": {"street": "XX大街","zipcode": "100000"}
}

如何與Java對象進行轉化

ObjectMapper 是 Jackson 庫中的一個核心類,主要用于在 Java 對象(POJO,Plain Old Java Object)和 JSON 數據之間進行轉換。 簡單來說,它能幫你把 JSON 字符串變成 Java 對象,也能把 Java 對象變成 JSON 字符串。

ObjectMapper 的主要功能:

  1. 序列化 (Serialization): 將 Java 對象轉換為 JSON 字符串。 這個過程也稱為 “marshalling”。
  2. 反序列化 (Deserialization): 將 JSON 字符串轉換為 Java 對象。 這個過程也稱為 “unmarshalling”。

為什么需要 ObjectMapper?

  • 簡化 JSON 處理: 手動解析 JSON 字符串或手動構建 JSON 字符串非常繁瑣且容易出錯。 ObjectMapper 封裝了這些復雜的操作,讓你只需要調用幾個簡單的方法就能完成轉換。
  • 類型安全: ObjectMapper 在轉換過程中會進行類型檢查,確保數據的正確性。 例如,如果你嘗試將一個包含字符串的 JSON 字段反序列化為 Java 的 int 類型,ObjectMapper 會拋出異常。
  • 配置靈活: ObjectMapper 提供了豐富的配置選項,可以自定義 JSON 轉換的行為,例如日期格式、字段命名策略、忽略未知字段等。

ObjectMapper 的常用方法:

  • writeValueAsString(Object value): 將 Java 對象轉換為 JSON 字符串。

    ObjectMapper mapper = new ObjectMapper();
    MyObject obj = new MyObject("張三", 30);
    String jsonString = mapper.writeValueAsString(obj);
    System.out.println(jsonString); // 輸出: {"name":"張三","age":30}
    
  • readValue(String content, Class<T> valueType): 將 JSON 字符串轉換為 Java 對象。

    ObjectMapper mapper = new ObjectMapper();
    String jsonString = "{\"name\":\"李四\",\"age\":25}";
    MyObject obj = mapper.readValue(jsonString, MyObject.class);
    System.out.println(obj.getName()); // 輸出: 李四
    System.out.println(obj.getAge());  // 輸出: 25
    

易錯點:
·readValue(String content, TypeReference<T> valueTypeRef): 將 JSON 字符串轉換為復雜的泛型類型(如 List 或 Map<K, V>)。

當你需要將一個 JSON 數組轉換為 Java 的 List 集合時,你需要使用 TypeReference 來幫助 Jackson 保留泛型信息。

ObjectMapper mapper = new ObjectMapper();
String jsonArrayString = "[{\"name\":\"張三\",\"age\":30}, {\"name\":\"李四\",\"age\":25}]";// 錯誤的做法:mapper.readValue(jsonArrayString, List.class);
// 這會導致 List 中的元素被解析為 LinkedHashMap,而不是 MyObject// 正確的做法:使用 TypeReference
List<MyObject> userList = mapper.readValue(jsonArrayString, new TypeReference<List<MyObject>>() {});System.out.println(userList.get(0).getName()); // 輸出: 張三
  • readTree(String content): 將 JSON 字符串轉換為 JsonNode 對象。 JsonNode 是 Jackson 庫中表示 JSON 樹結構的類,可以方便地訪問 JSON 數據的各個部分。

    ObjectMapper mapper = new ObjectMapper();
    String jsonString = "{\"name\":\"王五\",\"age\":40}";
    JsonNode rootNode = mapper.readTree(jsonString);
    String name = rootNode.get("name").asText();
    int age = rootNode.get("age").asInt();
    System.out.println(name); // 輸出: 王五
    System.out.println(age);  // 輸出: 40
    

使用 ObjectMapper 的步驟:

  1. 添加 Jackson 依賴: 在你的項目中添加 Jackson 庫的依賴。 如果你使用 Maven,可以在 pom.xml 文件中添加以下依賴:(如果是Springboot項目那么其已經內置了,不需要再導入)

    <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.16.1</version>  <!-- 使用最新版本 -->
    </dependency>
    
  2. 創建 ObjectMapper 對象

  • 普通項目

    ObjectMapper mapper = new ObjectMapper();
    
  • SpringBoot項目

    • 正如前文所說,Spring Boot 已經為我們自動配置了一個 ObjectMapper Bean。因此,在 Spring Boot 項目中,我們不應該手動 new ObjectMapper(),而應該通過依賴注入(DI)來使用這個已經配置好的單例對象。
@Service
public class MyService {private final ObjectMapper objectMapper;// 通過構造函數注入(推薦)@Autowiredpublic MyService(ObjectMapper objectMapper) {this.objectMapper = objectMapper;}public void doSomething() {// 直接使用注入的 objectMapper 實例// ...}
}
  1. 調用 ObjectMapper 的方法進行 JSON 轉換: 使用 writeValueAsString() 進行序列化,使用 readValue()readTree() 進行反序列化。

ObjectMapper 的高級用法:

  • 自定義序列化器和反序列化器: 可以自定義 JsonSerializerJsonDeserializer 來控制 JSON 轉換的細節。
  • 使用注解: 可以使用 Jackson 提供的注解 (例如 @JsonProperty, @JsonIgnore, @JsonFormat) 來配置 JSON 轉換的行為。
    • @JsonProperty("user_name"): 用于指定 Java 屬性在 JSON 中對應的鍵名,常用于連接不同的命名風格(如 Java 的駝峰 userName 和 JSON 的下劃線 user_name)。
    • @JsonIgnore: 在序列化和反序列化時完全忽略某個屬性。
    • @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss"): 用于指定 Date 或 LocalDateTime 等日期類型的格式。
  • 配置 ObjectMapper: 可以通過 ObjectMapper 的配置方法 (例如 configure(), setPropertyNamingStrategy()) 來調整 JSON 轉換的各種參數。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/90515.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/90515.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/90515.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從零開始的云計算生活——第三十六天,山雨欲來,Ansible入門

目錄 一.故事背景 二.Ansible簡介 什么是Ansible&#xff1f; Ansible的特點 Ansible的架構 三.Ansible任務執行解析 ansible任務執行模式 ansible執行流程 ansible命令執行過程&#xff08;重要&#xff09; 四.Ansible配置解析 ansible的安裝方式 ansible的程序結…

【6G新技術探索】AG-UI(Agent User Interaction Protocol) 協議介紹

博主未授權任何人或組織機構轉載博主任何原創文章&#xff0c;感謝各位對原創的支持&#xff01; 博主鏈接 本人就職于國際知名終端廠商&#xff0c;負責modem芯片研發。 在5G早期負責終端數據業務層、核心網相關的開發工作&#xff0c;目前牽頭6G技術研究。 博客內容主要圍繞…

線性代數 下

文章目錄十一、方程組解的結構和性質1、齊次線性方程組2、非齊次線性方程組十二、Ax0的基礎解系十三、兩個方程組的公共解十四、同解方程十五、求特征值、特征向量十六、判斷A能否相似對角化十七、若A可以相似對角化&#xff0c;求P(Q)十八、二次型化標準型1、拉格朗日配方法2、…

Go語言實戰案例-自定義隊列結構

以下是《Go語言100個實戰案例》中的 數據結構與算法篇 - 案例24&#xff1a;自定義隊列結構 的完整內容&#xff0c;幫助初學者通過自定義結構體來實現隊列的數據結構。&#x1f3af; 案例目標實現一個自定義的隊列結構&#xff0c;并提供常見的隊列操作&#xff1a;入隊&#…

Windows-WSL-Docker端口開放

本文介紹如何在局域網內訪問Windows服務器端口&#xff0c;特別是針對已安裝WSL環境并在其中運行Docker服務的情況。主要解決Docker服務向局域網開放端口的配置問題步驟一&#xff1a;配置轉發當你的應用程運行在WSL中時&#xff0c;需要執行此步驟。在宿主機&#xff08;windo…

面試知識梳理-vue3和vue2區別

vue3相對于vue2的優勢 性能更好體積更小更好的ts支持&#xff08;vue3 ts開發&#xff09;更好的代碼組織更好的邏輯抽離更多新功能&#xff08;vue2其實也都能自己做出來&#xff09; 更好的代碼組織 Composition API 的革新 Vue 2 采用 ??Options API??&#xff0c;通過 …

棧的核心原理

1 棧的概念及結構棧是一種特殊的線性表&#xff0c;其特點是只允許在固定的一端進行插入和刪除操作。進行操作的一端稱為棧頂&#xff0c;另一端稱為棧底。棧中的元素遵循后進先出&#xff08;LIFO&#xff0c;Last In First Out&#xff09; 原則。壓\入\進棧&#xff08;Push…

【無標題】暗物質暗能量——以下是用11維拓撲量子色動力學模型解釋暗物質和暗能量的完整理論框架。

暗物質暗能量——以下是用11維拓撲量子色動力學模型解釋暗物質和暗能量的完整理論框架。暗物質的拓撲本質 1. 跨橋零模振動理論 暗物質對應跨橋結構的基態振動模&#xff1a; math \phi_{\text{DM}} \frac{1}{\sqrt{6}} \sum_{f1}^6 \mathcal{B}_f^{(0)} $$ 其中 $\mathcal{B}…

【接口自動化】-1- 初識接口

一、什么是接口 接口涉及到四個實體&#xff1a;&#xff08;我去飯店點餐&#xff09; 我是客人 &#xff1a;客戶端 廚師&#xff1a;服務器 服務員&#xff1a;接口 菜單&#xff1a;接口文檔 接口定義了一套信息規則讓兩個系統之間互相不必知道對方的內部&#xff0c…

華為FTTR光貓V173 F30改公開版界面 附帶真正的s161補全一體固件

【本文介紹】 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 這款FTTR的V173 F30看著顏值很高 也很實用 畢竟是XGPON萬兆的光貓…

【學習】數字化車間與智能工廠如何推進制造業轉型

在制造業轉型升級的浪潮中&#xff0c;數字化車間與智能工廠已成為推動產業變革的核心引擎。前者通過物聯網、大數據與自動化技術的深度融合&#xff0c;實現生產流程的精細化管控與資源優化&#xff1b;后者則依托人工智能、5G通信與數字孿生技術&#xff0c;構建起具備自感知…

HTML元素與高級功能完全教程:從基礎到精通

目錄 章節1:HTML的靈魂——元素的本質與結構化思維 1.1 元素的核心:標簽、屬性與內容 1.2 語義化的革命 1.3 常見的“坑”與避坑指南 章節2:表單元素:打造交互的基石 2.1 表單基礎:與核心控件 2.2 高級輸入類型與驗證 2.3 表單的可訪問性與用戶體驗 章節3:HTML5多媒…

IP證書:構建數字世界知識產權安全防線的基石

引言 在數字化浪潮席卷全球的今天&#xff0c;知識產權&#xff08;IP&#xff09;的保護已成為企業、機構乃至個人面臨的重要挑戰。無論是商業秘密、專利技術&#xff0c;還是數字版權&#xff0c;其安全性和可信度都直接影響著創新生態的健康發展。而作為數字安全的核心工具…

CAD插件『PDF轉CAD格式』安裝教程

在工程設計領域&#xff0c;常規流程是將完成的CAD圖紙直接轉換為PDF格式或輸出為紙質藍圖進行分發。由于PDF文件具有跨平臺兼容性強、防篡改等特性&#xff0c;在工程交付環節被廣泛采用。但當需要對既有圖紙進行二次修改時&#xff0c;PDF格式的編輯局限性便凸顯出來&#xf…

【硬件-筆試面試題】硬件/電子工程師,筆試面試題-26,(知識點:硬件電路的調試方法:信號追蹤,替換,分段調試)

目錄 1、題目 2、解答 一、信號追蹤法&#xff08;Signal Tracing&#xff09; 原理 操作步驟 應用場景 二、替換法&#xff08;Replacement Method&#xff09; 原理 操作要點 應用場景 三、分段調試法&#xff08;Segmented Debugging&#xff09; 原理 操作步驟…

Qt中QObject類的核心作用與使用

一、QObject類簡介 各位小伙伴&#xff0c;在Qt的世界里&#xff0c;QObject類就像是"萬物之母"&#xff0c;它是Qt對象模型的核心基類。幾乎所有的Qt類都直接或間接地繼承自QObject。QObject提供了很多重要的功能&#xff0c;比如對象樹管理、信號與槽機制、元對象系…

TVBOXOS6.0雙端APP二開源碼完整版全開源源碼重構版

今天介紹的TVBOXOS手機版App源碼采用了純64位的前端架構&#xff0c;版本則基于本站修正過的6.0前端進行構建。經過多次優化&#xff0c;這款應用不僅操作流暢&#xff0c;界面設計也頗具美感。前端完全集成了安卓原生Java架構&#xff0c;而后端管理采用的是PHP的如意系統。前…

VoWiFi技術深度解析:架構、流程與演進

在蜂窩網絡覆蓋盲區實現高清語音通話的秘密,就藏在這套基于IMS的Wi-Fi呼叫系統中 一、VoWiFi概述與技術價值 VoWiFi(Voice over Wi-Fi)是一種基于IMS核心網的語音通信技術,允許用戶通過Wi-Fi接入運營商的EPC(演進分組核心網)和IMS系統,實現與傳統蜂窩網絡無縫集成的語音…

DuoPlus云手機再上新:統一配置品牌型號、代理分組與便捷搜索功能全面提升!

前言&#xff1a;在這個日新月異的時代&#xff0c;每一個微小的變化都可能引領行業新潮流&#xff0c;DuoPlus云手機基于不斷創新的原則&#xff0c;把用戶的需求放在第一位&#xff0c;不斷對產品進行調整優化&#xff0c;致力于給用戶最全面的產品體驗。DuoPlus通過收集用戶…

C/C++內存陷阱:為何返回局部變量地址是“定時炸彈”?

資料合集下載鏈接: ?https://pan.quark.cn/s/472bbdfcd014? 在編程世界里,有些錯誤就像是隱藏在代碼里的“定時炸彈”,平時可能相安無事,但在某個不經意的時刻就會引爆,導致程序崩潰或出現無法解釋的詭異行為。今天,我們要拆解的,就是這樣一個極具迷惑性又極其危險的…