首页 > 解决方案 > 为什么继承的类不能是json编码

问题描述

我有一个 2 类,其中一个继承自基类

基类

class Member : NSObject , Codable{
var Address : String?
var BriefDescription : String?
var City : String?
}

这是我继承的类:

class MemberSingUp : Member {
var Password : String?
var passwordAgain : String?
var referansNumber : String?
}

我创建了对象,然后将数据加载到其中。

    var newMember = MemberSingUp()
    newMember.Address = "Adress"
    newMember.BriefDescription = "BriefDescription"
    newMember.City = "City"
     
    newMember.Password = "123456"

然后我尝试像这样编码这个模型

        var memberJson : String = ""
    do{
        let jsonEncoder = JSONEncoder()
        let jsonData = try jsonEncoder.encode(newMember)
       
        memberJson = String(data: jsonData, encoding: String.Encoding.utf8)!

    }catch{}
    print(memberJson)

memberJson{"Address":"Adress","BriefDescription":"BriefDescription","City":"City"}. Password不编码

那么,为什么继承的类对象不编码呢?

更新:根据我使用的评论

required init(from decoder: Decoder) throws {

    let container = try decoder.container(keyedBy: CodingKeys.self)
    let superdecoder = try container.superDecoder()
    try super.init(from: superdecoder)

    Password = try container.decode(String.self, forKey: .Password)
    

}

override func encode(to encoder: Encoder) throws {

    var container = encoder.container(keyedBy: CodingKeys.self)
    try container.encode(Password, forKey: .Password)


    let superencoder = container.superEncoder()
    try super.encode(to: superencoder)

}

它改变了json,如:

{"Password":"1234567","super":{"Address":"Address","BriefDescription":"BriefDescription","City":"City"}}

如何删除此super密钥

标签: iosswiftclassencoding

解决方案


这并不难:

override func encode(to encoder: Encoder) throws {
    var container = encoder.container(keyedBy: CodingKeys.self)
    try container.encode(Password, forKey: .Password)

    try super.encode(to: encoder)
}

无需创建嵌套编码器。

它与解码相同:

required init(from decoder: Decoder) throws {
    let container = try decoder.container(keyedBy: CodingKeys.self)
    Password = try container.decode(String.self, forKey: .Password)
    try super.init(from: decoder)
}

推荐阅读