最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java對象與JSON互相轉(zhuǎn)化的示例詳解

 更新時間:2025年07月28日 10:01:08   作者:doublez234  
JSON (JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式,易于人閱讀和編寫,同時也易于機器解析和生成,下面我們就來聊聊Java對象與JSON如何互相轉(zhuǎn)化吧

JSON概念

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

JSON 的主要特點:

輕量級: JSON 格式非常簡潔,只包含必要的數(shù)據(jù)信息,減少了傳輸?shù)臄?shù)據(jù)量,提高了數(shù)據(jù)傳輸效率。

易于閱讀和編寫: JSON 的結(jié)構(gòu)清晰,使用鍵值對的方式組織數(shù)據(jù),易于人理解和編寫。

易于解析和生成: 各種編程語言都提供了 JSON 解析器和生成器,方便程序處理 JSON 數(shù)據(jù)。

跨平臺、跨語言: JSON 是一種與編程語言無關(guān)的數(shù)據(jù)格式,可以在不同的平臺和編程語言之間進行數(shù)據(jù)交換。

數(shù)據(jù)結(jié)構(gòu): JSON 支持兩種基本的數(shù)據(jù)結(jié)構(gòu):

  • 對象(Object): 由花括號 {} 包圍,包含一系列鍵值對。鍵必須是字符串,值可以是基本數(shù)據(jù)類型(字符串、數(shù)字、布爾值、null)、數(shù)組或另一個 JSON 對象。
  • 數(shù)組(Array): 由方括號 [] 包圍,包含一系列值。值可以是基本數(shù)據(jù)類型(字符串、數(shù)字、布爾值、null)、JSON 對象或另一個數(shù)組。

JSON 的數(shù)據(jù)類型:

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

語法:

  • 數(shù)據(jù)在 鍵值對(Key/Value) 中
  • 數(shù)據(jù)由逗號 , 分隔
  • 對象? {} 表?
  • 數(shù)組? [] 表?
  • 值可以為對象, 也可以為數(shù)組, 數(shù)組中可以包含多個對象

JSON 示例:

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

如何與Java對象進行轉(zhuǎn)化

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

ObjectMapper 的主要功能

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

為什么需要 ObjectMapper

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

ObjectMapper 的常用方法

writeValueAsString(Object value): 將 Java 對象轉(zhuǎn)換為 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 字符串轉(zhuǎn)換為 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 字符串轉(zhuǎn)換為復(fù)雜的泛型類型(如 List 或 Map<K, V>)。

當(dāng)你需要將一個 JSON 數(shù)組轉(zhuǎn)換為 Java 的 List 集合時,你需要使用 TypeReference 來幫助 Jackson 保留泛型信息。

ObjectMapper mapper = new ObjectMapper();
String jsonArrayString = "[{\"name\":\"張三\",\"age\":30}, {\"name\":\"李四\",\"age\":25}]";

// 錯誤的做法:mapper.readValue(jsonArrayString, List.class);
// 這會導(dǎo)致 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 字符串轉(zhuǎn)換為 JsonNode 對象。 JsonNode 是 Jackson 庫中表示 JSON 樹結(jié)構(gòu)的類,可以方便地訪問 JSON 數(shù)據(jù)的各個部分。

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 的步驟

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

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.16.1</version>  <!-- 使用最新版本 -->
</dependency>

創(chuàng)建 ObjectMapper 對象

普通項目

ObjectMapper mapper = new ObjectMapper();

SpringBoot項目

正如前文所說,Spring Boot 已經(jīng)為我們自動配置了一個 ObjectMapper Bean。因此,在 Spring Boot 項目中,我們不應(yīng)該手動 new ObjectMapper(),而應(yīng)該通過依賴注入(DI)來使用這個已經(jīng)配置好的單例對象。

@Service
public class MyService {

    private final ObjectMapper objectMapper;

    // 通過構(gòu)造函數(shù)注入(推薦)
    @Autowired
    public MyService(ObjectMapper objectMapper) {
        this.objectMapper = objectMapper;
    }

    public void doSomething() {
        // 直接使用注入的 objectMapper 實例
        // ...
    }
}

調(diào)用 ObjectMapper 的方法進行 JSON 轉(zhuǎn)換: 使用 writeValueAsString() 進行序列化,使用 readValue()readTree() 進行反序列化。

ObjectMapper 的高級用法

自定義序列化器和反序列化器: 可以自定義 JsonSerializerJsonDeserializer 來控制 JSON 轉(zhuǎn)換的細節(jié)。

使用注解: 可以使用 Jackson 提供的注解 (例如 @JsonProperty, @JsonIgnore, @JsonFormat) 來配置 JSON 轉(zhuǎn)換的行為。

  • @JsonProperty("user_name"): 用于指定 Java 屬性在 JSON 中對應(yīng)的鍵名,常用于連接不同的命名風(fēng)格(如 Java 的駝峰 userName 和 JSON 的下劃線 user_name)。
  • @JsonIgnore: 在序列化和反序列化時完全忽略某個屬性。
  • @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss"): 用于指定 Date 或 LocalDateTime 等日期類型的格式。

配置 ObjectMapper: 可以通過 ObjectMapper 的配置方法 (例如 configure(), setPropertyNamingStrategy()) 來調(diào)整 JSON 轉(zhuǎn)換的各種參數(shù)。

到此這篇關(guān)于Java對象與JSON互相轉(zhuǎn)化的示例詳解的文章就介紹到這了,更多相關(guān)Java對象轉(zhuǎn)JSON內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot集成redis之字典緩存詳解

    springboot集成redis之字典緩存詳解

    Redis的字典緩存是支撐其高性能的一個關(guān)鍵因素,它使得Redis能夠以極快的速度處理大量的數(shù)據(jù),這篇文章主要介紹了springboot集成redis之字典緩存,需要的朋友可以參考下
    2024-07-07
  • 解決idea導(dǎo)入ssm項目啟動tomcat報錯404的問題

    解決idea導(dǎo)入ssm項目啟動tomcat報錯404的問題

    今天小編就為大家分享一篇解決idea導(dǎo)入ssm項目啟動tomcat報錯404的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • IDEA如何實現(xiàn)查看UML類圖

    IDEA如何實現(xiàn)查看UML類圖

    這篇文章主要介紹了IDEA如何實現(xiàn)查看UML類圖問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • 詳解Spring如何整合Mybatis

    詳解Spring如何整合Mybatis

    今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識,文章圍繞著Spring如何整合Mybatis展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Spring事務(wù)管理的全解析

    Spring事務(wù)管理的全解析

    在一個業(yè)務(wù)流程中,需要多條DML(insert、delete、update)語句聯(lián)合才能完成,本文介紹了Spring事務(wù)管理的各個方面,感興趣的朋友跟隨小編一起看看吧
    2026-02-02
  • 淺談Java到底是值傳遞還是引用傳遞呢

    淺談Java到底是值傳遞還是引用傳遞呢

    今天帶大家學(xué)習(xí)Java的相關(guān)知識,文章圍繞著Java到底是值傳遞還是引用傳遞展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 一篇清晰易懂的Java 8徹底卸載與清理教程

    一篇清晰易懂的Java 8徹底卸載與清理教程

    這篇文章主要介紹了Java 8徹底卸載與清理的相關(guān)資料,包括卸載程序、刪除殘留文件、清理環(huán)境變量及注冊表,最后通過命令驗證卸載是否成功,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-05-05
  • Java多線程Future松獲取異步任務(wù)結(jié)果輕松實現(xiàn)

    Java多線程Future松獲取異步任務(wù)結(jié)果輕松實現(xiàn)

    這篇文章主要為大家介紹了Java多線程Future松獲取異步任務(wù)結(jié)果輕松實現(xiàn)方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • Java中的Date、LocalDate和LocalDateTime使用及區(qū)別

    Java中的Date、LocalDate和LocalDateTime使用及區(qū)別

    這篇文章主要介紹了Java中的Date、LocalDate和LocalDateTime使用及區(qū)別,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2026-05-05
  • 解決static類使用@Value獲取yml文件獲取不到的問題

    解決static類使用@Value獲取yml文件獲取不到的問題

    在靜態(tài)類中直接使用@Value注解無法獲取yml文件中的配置,解決方案是在工具類Utils中創(chuàng)建靜態(tài)的setter方法,并從外部類ServiceClass中調(diào)用這個方法來設(shè)置值,這種方法通過外部調(diào)用來間接設(shè)置靜態(tài)變量的值,從而成功讀取yml配置
    2024-09-09

最新評論

前郭尔| 三亚市| 龙井市| 合山市| 鄂州市| 南雄市| 海口市| 濮阳县| 图们市| 东辽县| 金塔县| 丹凤县| 原阳县| 马公市| 凤山县| 静乐县| 正安县| 介休市| 凤山县| 云林县| 巨野县| 伽师县| 吴江市| 安仁县| 阿克陶县| 达日县| 鹿邑县| 开化县| 淳化县| 辽宁省| 石台县| 张家界市| 巴楚县| 寻甸| 文成县| 许昌县| 黄梅县| 永福县| 民权县| 万安县| 安吉县|