The Util Designer
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)
            }
        }
    }
}