【问题标题】:Swift 4 Codable , CodingKey only for decodeSwift 4 Codable , CodingKey 仅用于解码
【发布时间】:2018-02-06 10:20:22
【问题描述】:

CodingKey 是否可以仅用于JSONEncoderJSONDecoder 使用默认成员名称?

示例我有以下结构

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,所以无法正常工作

任何人都可以建议我一个想法或链接?

【问题讨论】:

  • (是"kölsch",而不是“kolsch”???? :)

标签: ios swift swift4 codable


【解决方案1】:

试试这个:

  1. 添加两个枚举,一个用于编码,一个用于解码,例如EncodingKeysDecodingKeys
  2. 像这样编写自定义 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 正在合成中。

【讨论】:

  • 感谢您的回答!!,encode 函数将用于JSONDecoderJSONEncoder
  • encode 函数实现了自定义编码,顾名思义就是JSONEncoder :)
  • 您的答案在某种程度上是正确的,但我要问的是CodingKey 枚举可以用于JSONEncoder 仅用于解码器我不想要额外的枚举
  • 是的,正如我在更新答案中所写:将您的枚举重命名为 EncodingKeys。因此,您可以将其用于JSONEncoder,并使用func encode(to encoder: Encoder)... 的自定义实现,就像我上面的代码一样。重命名后没有CodingKeys枚举,所以编译器在后台生成一个将用于JSONDecoder。这些编码键将是默认的,因此与您的属性名称相同。
  • 如果我使用两个枚举,一个用于编码器,一个用于解码器,那么它工作正常。作为 。您说对于 json 解码器,它将在无法正常工作的背景中创建枚举!请在代码中添加示例
猜你喜欢
  • 1970-01-01
  • 2018-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-04
  • 2017-12-05
  • 2021-05-24
相关资源
最近更新 更多