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
    }
  • 相关阅读:
    django框架——十二
    django框架——十一
    请简述一下你所了解的数据源控件有哪些
    在ASP.NET中,<%= %>和<%# %>有什么区别
    请解释ASP.NET中的web页面与其隐藏类之间的关系
    什么是viewstate,能否禁用?是否所用控件都可以禁用
    WEB控件及HTML服务端控件能否调用客户端方法?如果能,请解释如何调用
    静态类和静态方法的好处
    请写出在ASP.NET中常用的几种页面间传值的方法,并说出它们的特点。
    连接数据库主要有哪几个对象
  • 原文地址:https://www.cnblogs.com/HackHer/p/8507888.html
Copyright © 2011-2022 走看看