[英]Swift 4 Codable , CodingKey only for decode
Is it possible that CodingKey
can be used for only JSONEncoder
and for JSONDecoder
use default member names ? CodingKey
可以仅用于JSONEncoder
而对于JSONDecoder
使用默认成员名称?
Example I have following structure示例我有以下结构
var str = """
{
"name": "Endeavor",
"abv": 8.9,
"brewery": "Saint Arnold",
"style": "ipa"
}
"""
enum BeerStyle:String,Codable {
case ipa
case stout
case kolsch
}
struct Beer : Codable {
let name : String
let brewery : String
let style : BeerStyle
let abv : Float
// THIS SHOULD BE USED ONLY FOR JSONEncoder ?
enum CodingKeys:String,CodingKey {
case name
case abv = "alcohol_by_volume"
case brewery = "brewery_name"
case style
}
}
let jsonData = str.data(using: .utf8)!
let decoder = JSONDecoder() // how to to make it not to use Coding key
let beer = try! decoder.decode(Beer.self, from: jsonData)
will not work fine since enum CodingKeys:String,CodingKey
is there将无法正常工作,因为
enum CodingKeys:String,CodingKey
在那里
Any one can suggest me a idea or link ?任何人都可以建议我一个想法或链接?
Try this:尝试这个:
EncodingKeys
and DecodingKeys
EncodingKeys
和DecodingKeys
init(from decoder: Decoder)
and encode(to encoder: Encoder)
implementations like this.init(from decoder: Decoder)
和encode(to encoder: Encoder)
实现。 . .
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: EncodingKeys.self)
try container.encode(name, forKey: .name)
// ...
}
and和
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: DecodingKeys.self)
name = try values.decode(String.self, forKey: .name)
// ...
}
Update I tried it with just one implementation of encode(...)
.更新我仅使用
encode(...)
一种实现encode(...)
尝试。 You just need to rename the Enum to EncodingKeys.self
(or something else).您只需要将 Enum 重命名为
EncodingKeys.self
(或其他名称)。 Then implement the encode-function like described above.然后实现上面描述的编码功能。 For decoding the CodingKeys and init-function are being synthesized.
为了解码,正在合成 CodingKeys 和 init-function。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.