NSObject Декодируемое то же значение - PullRequest
0 голосов
/ 08 января 2019

JSON:

{
   "words": "1"
}

несколько раз ключ words или word

при разборе этого JSON происходит сбой со следующей ошибкой

Ошибка:

keyNotFound (CodingKeys (stringValue: "абзац", intValue: nil), Swift.DecodingError.Context (codingPath: [], debugDescription: "Нет значения, связанного с ключом CodingKeys (stringValue: \" абзац \ ", intValue: nil ) (\ "абзац \"). ", underError: nil)). абзац это слова

@objcMembers class EmphasisModel: NSObject ,Codable{
    var words:String?
}
enum CodingKeys: String, CodingKey {
    case word,words
}

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

    if self.words != nil {
            self.words = try container.decode(String?.self, forKey: .word)
    }
}

1 Ответ

0 голосов
/ 08 января 2019

Вы должны использовать decodeIfPresent, а decoding. if statement не так. Он должен проверять на наличие равного нулю вместо ненулевого значения.

class EmphasisModel: Decodable {

    var words: String?

    enum CodingKeys: String, CodingKey {
        case word, words
    }

    required init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)

        self.words = try container.decodeIfPresent(String.self, forKey: .words)

        if self.words == nil {
            self.words = try container.decodeIfPresent(String.self, forKey: .word)
        }
    }
}

Использование

let data = """
          { "words": "1" }
         """.data(using: .utf8)!
do {
    let ad = try JSONDecoder().decode(EmphasisModel.self, from: data)
    print(ad?.words)
} catch {
    print(error)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...