JSON概念
JSON (JavaScript Object Notation) 是一種輕量級的數據交換格式。它易于人閱讀和編寫,同時也易于機器解析和生成。JSON 基于 JavaScript(ECMAScript(歐洲計算機協會制定的js規范)) 編程語言的一個子集,但它是一種獨立于語言的數據格式,被廣泛應用于各種編程語言和平臺之間的數據交換。
JSON 的主要特點:
- 輕量級: JSON 格式非常簡潔,只包含必要的數據信息,減少了傳輸的數據量,提高了數據傳輸效率。
- 易于閱讀和編寫: JSON 的結構清晰,使用鍵值對的方式組織數據,易于人理解和編寫。
- 易于解析和生成: 各種編程語言都提供了 JSON 解析器和生成器,方便程序處理 JSON 數據。
- 跨平臺、跨語言: JSON 是一種與編程語言無關的數據格式,可以在不同的平臺和編程語言之間進行數據交換。
- 數據結構: JSON 支持兩種基本的數據結構:
- 對象(Object): 由花括號
{}
包圍,包含一系列鍵值對。鍵必須是字符串,值可以是基本數據類型(字符串、數字、布爾值、null)、數組或另一個 JSON 對象。 - 數組(Array): 由方括號
[]
包圍,包含一系列值。值可以是基本數據類型(字符串、數字、布爾值、null)、JSON 對象或另一個數組。
- 對象(Object): 由花括號
JSON 的數據類型:
- 字符串(String): 用雙引號
""
包圍的 Unicode 字符序列。 - 數字(Number): 可以是整數或浮點數。
- 布爾值(Boolean):
true
或false
。 - 空值(Null):
null
。 - 對象(Object): 鍵值對的集合。
- 數組(Array): 值的有序列表。
語法:
-
數據在 鍵值對(Key/Value) 中
-
數據由逗號 , 分隔
-
對象?
{}
表? -
數組?
[]
表? -
值可以為對象, 也可以為數組, 數組中可以包含多個對象
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 的主要功能:
- 序列化 (Serialization): 將 Java 對象轉換為 JSON 字符串。 這個過程也稱為 “marshalling”。
- 反序列化 (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 的步驟:
-
添加 Jackson 依賴: 在你的項目中添加 Jackson 庫的依賴。 如果你使用 Maven,可以在
pom.xml
文件中添加以下依賴:(如果是Springboot
項目那么其已經內置了,不需要再導入)<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.16.1</version> <!-- 使用最新版本 --> </dependency>
-
創建 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 實例// ...}
}
- 調用 ObjectMapper 的方法進行 JSON 轉換: 使用
writeValueAsString()
進行序列化,使用readValue()
或readTree()
進行反序列化。
ObjectMapper 的高級用法:
- 自定義序列化器和反序列化器: 可以自定義
JsonSerializer
和JsonDeserializer
來控制 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 轉換的各種參數。