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):
true
或false
。 - 空值(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 的高級用法
自定義序列化器和反序列化器: 可以自定義 JsonSerializer
和 JsonDeserializer
來控制 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)文章
Mybatis Order by動態(tài)參數(shù)防注入方式
這篇文章主要介紹了Mybatis Order by動態(tài)參數(shù)防注入方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04