Swift JSON 處理

import Foundation

let jsonString = "{\"code\":0,\"message\":\"\",\"data\":[{\"name\":\"Google\",\"url\":\"http://www.google.com\"},{\"name\":\"Google2\",\"url\":\"http://www.google.com\"}]}"
let jsonString2 = "{\"code\":200,\"message\":\"Unknown Error\",\"data\":{\"key\":\"value\"}}"


// String -> Dictionary || Array
if let data = jsonString.data(using: .utf8) {
    let jsonObject = try? JSONSerialization.jsonObject(with: data) as? [String: AnyObject]
    print("\(jsonObject ?? [:])")
}

// Dictionary || Array -> String
let data = try? JSONSerialization.data(withJSONObject: ["code":0,"message":"","data":["aa","bb"]], options: .prettyPrinted)
print("\(String(data: data!, encoding: .utf8)!)")


// String -> Model
protocol HumanReadable {
    func toHuman() -> String?
}
extension Array: HumanReadable where Element: HumanReadable {
    func toHuman() -> String? {
        var str = ""
        for data in self {
            str += "[\(data.toHuman() ?? "")],"
        }
        return str
    }
}

struct SuccessData: Codable, HumanReadable {
    var name: String?
    var url: String?
    
    enum CodingKeys : String, CodingKey {
        case name
        case url
    }
    
    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        
        name = try values.decode(String.self, forKey: CodingKeys.name)
        url = try values.decode(String.self, forKey: CodingKeys.url)
    }
    
    func toHuman() -> String? {
        return "name=\(name ?? ""),url=\(url ?? "")"
    }
}

struct ErrorData: Codable, HumanReadable{
    var key: String?
    
    enum CodingKeys : String, CodingKey {
        case key
    }
    
    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        
        key = try values.decode(String.self, forKey: CodingKeys.key)
    }
    
    func toHuman() -> String? {
        return "key=\(key ?? "")"
    }
}

struct Result<T: Codable & HumanReadable>: Codable, HumanReadable {
    var code: Int
    var message: String?
    var data: T?
    
    enum CodingKeys : String, CodingKey {
        case code
        case message
        case data
    }
    
    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        
        code = try values.decode(Int.self, forKey: CodingKeys.code)
        message = try values.decode(String.self, forKey: Result.CodingKeys.message)
        data = try values.decode(T.self, forKey: CodingKeys.data)
    }
    
    func toHuman() -> String? {
        return "\(data?.toHuman() ?? "")"
    }
}


let decoder = JSONDecoder()
let result = try decoder.decode(Result<Array<SuccessData>>.self, from: jsonString.data(using: String.Encoding.utf8)!)
print(result.toHuman()!)

let result2 = try decoder.decode(Result<ErrorData>.self, from: jsonString2.data(using: String.Encoding.utf8)!)
print(result2.toHuman()!)

備注:HumanReadable 用來(lái)實(shí)現(xiàn)打印結(jié)構(gòu)體中的屬性

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容