Swift 4 Codable , CodingKey 仅用于解码
Swift 4 Codable , CodingKey only for decode
是否可以 CodingKey
仅用于 JSONEncoder
而 JSONDecoder
使用默认成员名称?
示例我有以下结构
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)
将无法正常工作,因为 enum CodingKeys:String,CodingKey
在那里
任何人都可以建议我一个想法或 link?
试试这个:
- 添加两个枚举,一个用于编码,一个用于解码,例如
EncodingKeys
和 DecodingKeys
- 像这样编写自定义
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)
// ...
}
和
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: DecodingKeys.self)
name = try values.decode(String.self, forKey: .name)
// ...
}
更新
我只用 encode(...)
的一种实现方式进行了尝试。您只需要将 Enum 重命名为 EncodingKeys.self
(或其他名称)。然后像上面描述的那样实现编码功能。为了解码,正在合成 CodingKeys 和 init-function。
是否可以 CodingKey
仅用于 JSONEncoder
而 JSONDecoder
使用默认成员名称?
示例我有以下结构
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)
将无法正常工作,因为 enum CodingKeys:String,CodingKey
在那里
任何人都可以建议我一个想法或 link?
试试这个:
- 添加两个枚举,一个用于编码,一个用于解码,例如
EncodingKeys
和DecodingKeys
- 像这样编写自定义
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)
// ...
}
和
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: DecodingKeys.self)
name = try values.decode(String.self, forKey: .name)
// ...
}
更新
我只用 encode(...)
的一种实现方式进行了尝试。您只需要将 Enum 重命名为 EncodingKeys.self
(或其他名称)。然后像上面描述的那样实现编码功能。为了解码,正在合成 CodingKeys 和 init-function。