Codable JSON轉Model的使用介紹
Codable是Swift4中引入的一種協議,它可以將自定義的Swift類型與JSON進行編碼和解碼,使得我們在使用JSON數據時更加便捷。在與JSON數據打交道的過程中,我們通常需要將JSON數據轉換為我們自定義的類型,以方便數據的獲取和處理。這時候,我們可以使用Codable協議來解決這個問題。
Codable協議可以理解成是一個樹形結構,結構中的每個元素都是一個可解碼或可編碼的容器。在對其中的數據進行編碼或解碼時,我們只需要實現Codable協議的兩個方法即可:
func encode(to encoder: Encoder) throws
init(from decoder: Decoder) throws
具體來說,在使用Codable解碼或編碼時,我們通常需要使用JSONDecoder或JSONEncoder進行協議的實現。下面我們來看一個具體的范例,讓大家更好的理解Codable的使用。
import Foundation
struct Person: Codable {
let name: String
let age: Int
let email: String?
}
let jsonString = """
{
"name": "Jack",
"age": 26,
"email": "jack@example.com"
}
"""
let jsonData = jsonString.data(using: .utf8)!
// 解碼
do {
let person = try JSONDecoder().decode(Person.self, from: jsonData)
print(person.name) // "Jack"
print(person.age) // 26
print(person.email!) // "jack@example.com"
} catch {
print("解碼失敗:\(error)")
}
// 編碼
do {
let person = Person(name: "Tom", age: 30, email: nil)
let jsonData = try JSONEncoder().encode(person)
let jsonString = String(data: jsonData, encoding: .utf8)!
print(jsonString) // {"name":"Tom","age":30}
} catch {
print("編碼失敗:\(error)")
}
在上面的示例中,我們定義了一個Person結構體,并讓其遵循了Codable協議。接著,我們使用JSONDecoder將JSON字符串轉換為Person實例,使用JSONEncoder將Person實例轉換為JSON字符串。
在使用Codable進行解碼或編碼時,還可以通過CodingKeys枚舉來指定我們自定義類型中的屬性與JSON數據中的鍵之間的映射關系。
struct Person: Codable {
let name: String
let age: Int
let email: String?
enum CodingKeys: String, CodingKey {
case name = "person_name"
case age
case email
}
}
當我們指定了CodingKeys時,用于解析JSON數據的key值就變為了我們指定的key值(如上面的person_name),而非原始的key值。這使得我們在處理JSON數據時更加靈活。
總之,Codable為我們在Swift中使用JSON數據提供了一種相對簡單的方式,極大地簡化了我們的代碼編寫。