美文网首页
Swift JSON 处理

Swift JSON 处理

作者: YU_YU_ | 来源:发表于2020-11-23 15:24 被阅读0次
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 用来实现打印结构体中的属性

相关文章

网友评论

      本文标题:Swift JSON 处理

      本文链接:https://www.haomeiwen.com/subject/kfhviktx.html