美文网首页
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