欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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)換的細(xì)節(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)文章

  • 在Java中讀取和解析JSON文件的示例代碼

    在Java中讀取和解析JSON文件的示例代碼

    我們在日常開發(fā)中少不了和JSON數(shù)據(jù)打交道,JSON是輕量、結(jié)構(gòu)化的數(shù)據(jù)交換格式,支持跨語言,本文給大家詳細(xì)介紹了如何在 Java 中讀取和解析 JSON 文件,并有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下
    2025-06-06
  • Mybatis Order by動態(tài)參數(shù)防注入方式

    Mybatis Order by動態(tài)參數(shù)防注入方式

    這篇文章主要介紹了Mybatis Order by動態(tài)參數(shù)防注入方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • 使用 Java 開發(fā) Gradle 插件的步驟

    使用 Java 開發(fā) Gradle 插件的步驟

    這篇文章主要介紹了使用 Java 開發(fā) Gradle 插件的步驟,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-03-03
  • 如何通過Java實現(xiàn)時間軸過程解析

    如何通過Java實現(xiàn)時間軸過程解析

    這篇文章主要介紹了如何通過Java實現(xiàn)時間軸過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • Java 進階必備之ssm框架全面整合

    Java 進階必備之ssm框架全面整合

    SSM框架是spring MVC ,spring和mybatis框架的整合,是標(biāo)準(zhǔn)的MVC模式,將整個系統(tǒng)劃分為表現(xiàn)層,controller層,service層,DAO層四層,使用spring MVC負(fù)責(zé)請求的轉(zhuǎn)發(fā)和視圖管理,spring實現(xiàn)業(yè)務(wù)對象管理,mybatis作為數(shù)據(jù)對象的持久化引擎
    2021-10-10
  • 詳解RestTemplate的三種使用方式

    詳解RestTemplate的三種使用方式

    這篇文章主要介紹了詳解RestTemplate的三種使用方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • Java實現(xiàn)心跳機制的方法

    Java實現(xiàn)心跳機制的方法

    這篇文章主要介紹了Java實現(xiàn)心跳機制的方法,文中講解非常細(xì)致,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • 詳解SpringBoot定時任務(wù)功能

    詳解SpringBoot定時任務(wù)功能

    這篇文章主要介紹了SpringBoot定時任務(wù)功能詳細(xì)解析,這次的功能開發(fā)過程中也算是對其內(nèi)涵的進一步了解,以后遇到定時任務(wù)的處理也更清晰,更有效率了,對SpringBoot定時任務(wù)相關(guān)知識感興趣的朋友一起看看吧
    2022-05-05
  • 基于swing實現(xiàn)窗體拖拽和拉伸

    基于swing實現(xiàn)窗體拖拽和拉伸

    這篇文章主要為大家詳細(xì)介紹了基于swing實現(xiàn)窗體拖拽和拉伸,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Java?list如何實現(xiàn)將指定元素排在第一位

    Java?list如何實現(xiàn)將指定元素排在第一位

    這篇文章主要為大家詳細(xì)介紹了Java?list中如何實現(xiàn)將指定元素排在第一位,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-02-02

最新評論