zoukankan      html  css  js  c++  java
  • Swift-JSON Encode && Decode

    typealias Codable = Encodable & Decodable
    
    struct Employee: Codable {
        var name:String
        var id: Int
        var mToy:Toy
    }
    
    struct Toy:Codable {
        var name:String
    }
    
    extension Employee:CustomStringConvertible {
        var description: String {
            return name + "(" + String(id) + "): " + mToy.name
        }
    }
    
    
    
            /// encode instance to jsonString
            let toyA = Toy(name: "Teddy Bear")
            let employeeA = Employee(name: "EmployA", id:1, mToy:toyA)
            let jsonEncoder = JSONEncoder()
            let jsonData = try? jsonEncoder.encode(employeeA)
            // Xcode omits jsonData and only provides the number of bytes in jsonData
            // jsonData contains an unreadable representation of employeeA
            print("jsonData: (jsonData)")
            let jsonString = String(data: jsonData!, encoding: .utf8)
            print("jsonString: (jsonString)")
            
            
            /// decode jsonString to instance
            let jsonDecoder = JSONDecoder()
            let employeeADecoded = try? jsonDecoder.decode(Employee.self, from: jsonData!)
            print(employeeADecoded!)


    //result
    /*

      jsonData: Optional(54 bytes)

      jsonString: Optional("{"name":"EmployA","id":1,"mToy":{"name":"Teddy Bear"}}")

      EmployA(1): Teddy Bear

    */

    假设,现在后台改接口了

    from : {"name":"EmployA","id":1,"mToy":{"name":"Teddy Bear"}}

    to : {"name":"EmployA","gift":"Teddy Bear","emplyeeID":1}

    需要实现encoding 和 decoding的逻辑。

    encode 需要实现 encode(to: Encoder) throws

    decode 需要实现 init(from decoder: Decoder) throws

    //typealias Codable = Encodable & Decodable
    
    struct Employee{
        var name:String
        var id: Int
        var mToy:Toy
        
        enum CodingKeys: String, CodingKey{
            case id = "emplyeeID"
            case name
            case gift
        }
    }
    
    extension Employee: Encodable {
        func encode(to encoder: Encoder) throws {
            var container = encoder.container(keyedBy: CodingKeys.self)
            try container.encode(name, forKey: .name)
            try container.encode(id, forKey: .id)
            try container.encode(mToy.name, forKey: .gift)
        }
    }
    
    extension Employee:Decodable {
        init(from decoder: Decoder) throws {
            let values = try decoder.container(keyedBy: CodingKeys.self)
            name = try values.decode(String.self, forKey: .name)
            id = try values.decode(Int.self, forKey: .id)
            let gift = try values.decode(String.self, forKey: .gift)
            mToy = Toy(name: gift)
        }
    }
    
    extension Employee:CustomStringConvertible {
        var description: String {
            return name + "(" + String(id) + "): " + mToy.name
        }
    }
    
    struct Toy{
        var name:String
    }
  • 相关阅读:
    Android与互联网的交互方式有三种
    Android 本地tomcat服务器接收处理手机上传的数据之案例演示
    Android 本地tomcat服务器接收处理手机上传的数据之环境搭建
    win7 查看当前java路径
    Android 使用tomcat搭建HTTP文件下载服务器
    Android 本地搭建Tomcat服务器供真机测试
    Android org.apache.http.*找不到
    Android IndicatorSeekBar
    Volley overview
    android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error(Sqlite code 14): Could not open database,(OS error
  • 原文地址:https://www.cnblogs.com/HackHer/p/8507888.html
Copyright © 2011-2022 走看看