为什么继承class不能json编码
Why inherited class can't be json encode
我有一个 2 class ,其中一个继承自基础 class
基地class
class Member : NSObject , Codable{
var Address : String?
var BriefDescription : String?
var City : String?
}
这是我继承的 class :
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
不编码
那么,为什么继承的class对象没有编码?
更新:
根据评论我使用
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
键
不难:
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)
}
我有一个 2 class ,其中一个继承自基础 class
基地class
class Member : NSObject , Codable{
var Address : String?
var BriefDescription : String?
var City : String?
}
这是我继承的 class :
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
不编码
那么,为什么继承的class对象没有编码?
更新: 根据评论我使用
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
键
不难:
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)
}