Swift 利用JSONDecoder來轉換成Object
xcode 13.4.1, swift 5.5, iOS 15.4
2022-09-06
JSON是很常用到的檔案格式,而在很多程式語言中都要相應的library可以拿來使用,Swift也不例外,Swift已內建了JSONDecoder來幫忙拆解JSON格式,不需要額外的library。
1. 假設有一種內容使用了JSON的格式,內容如下:
[
{
"name" : "Apple",
"number" : 10
},
{
"name" : "Banana",
"number" : 20
},
{
"name" : "Cat",
"number" : 30
},
{
"name" : "Dog",
"number" : 40
}
]
2. 首先它是一個Array,每個元素是一個Object,每個Object的內容包含兩個欄位,包括String的name和Int的number,所以可以建立有這兩個欄位的struct,為了使用JSONDecoder在拆解資料後放到object,這個struct要extend一個叫Codable protocol:
struct Fruit: Codable {
let name : String
let number : Int
}
3. 為了簡化整個程式,避免使用太多其他的知識,我們先不把JSON內容放到檔案中或從網路獲取,而是直接將其放在代碼中,並使用JSONDecoder.decode方法來拆解並返回一個object list:
import SwiftUI
struct Fruit: Codable {
let name : String
let number : Int
}
struct JSONExample: View {
@State var jsonData = """
[
{
"name" : "Apple",
"number" : 10
},
{
"name" : "Banana",
"number" : 20
},
{
"name" : "Cat",
"number" : 30
},
{
"name" : "Dog",
"number" : 40
}
]
"""
@State var fruits : [Fruit] = []
var body: some View {
List {
ForEach(0..<fruits.count, id:\.self) { index in
HStack {
Text("\(fruits[index].name)")
Spacer()
Text("$\(fruits[index].number)")
}
}
}
.onAppear {
do {
let decoder = JSONDecoder()
fruits = try decoder.decode([Fruit].self, from: Data(jsonData.utf8))
} catch let error {
print(error)
}
}
}
}