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

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

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

JSON概念

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

JSON 的主要特點(diǎn):

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

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

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

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

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

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

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

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

語(yǔ)法:

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

JSON 示例:

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

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

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

ObjectMapper 的主要功能

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

為什么需要 ObjectMapper

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

ObjectMapper 的常用方法

writeValueAsString(Object value): 將 Java 對(duì)象轉(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 對(duì)象。

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

易錯(cuò)點(diǎn):

readValue(String content, TypeReference<T> valueTypeRef): 將 JSON 字符串轉(zhuǎn)換為復(fù)雜的泛型類型(如 List 或 Map<K, V>)。

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

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

// 錯(cuò)誤的做法:mapper.readValue(jsonArrayString, List.class);
// 這會(huì)導(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 對(duì)象。 JsonNode 是 Jackson 庫(kù)中表示 JSON 樹結(jié)構(gòu)的類,可以方便地訪問(wèn) JSON 數(shù)據(jù)的各個(gè)部分。

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 依賴: 在你的項(xiàng)目中添加 Jackson 庫(kù)的依賴。 如果你使用 Maven,可以在 pom.xml 文件中添加以下依賴:(如果是Springboot項(xiàng)目那么其已經(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 對(duì)象

普通項(xiàng)目

ObjectMapper mapper = new ObjectMapper();

SpringBoot項(xiàng)目

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

@Service
public class MyService {

    private final ObjectMapper objectMapper;

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

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

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

ObjectMapper 的高級(jí)用法

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

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

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

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

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

相關(guān)文章

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

    springboot集成redis之字典緩存詳解

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

    解決idea導(dǎo)入ssm項(xiàng)目啟動(dòng)tomcat報(bào)錯(cuò)404的問(wèn)題

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

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

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

    詳解Spring如何整合Mybatis

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

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

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

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

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

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

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

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

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

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

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

    解決static類使用@Value獲取yml文件獲取不到的問(wèn)題

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

最新評(píng)論

甘孜县| 界首市| 汝阳县| 嘉兴市| 曲水县| 磐石市| 横峰县| 广宁县| 周至县| 奉化市| 盐山县| 辉南县| 广宗县| 谢通门县| 宜章县| 柞水县| 新巴尔虎右旗| 遂宁市| 黑河市| 安新县| 老河口市| 松阳县| 麻阳| 抚宁县| 凭祥市| 衡山县| 镇康县| 天长市| 仁布县| 息烽县| 化德县| 威远县| 南和县| 广饶县| 马边| 定边县| 开原市| 忻城县| 平利县| 鄢陵县| 宣化县|