Почему #Codable# не работает в приведенном ниже коде?

У меня есть код ниже для тестирования протокола Codable и JSONDecoder.

import UIKit

class ClassA: Codable {
    var age: Int = 1
}

class ClassB: Codable {
    var ageInfo: ClassA?
    var name: String
}

let json4 = """
{
    "ageInfo": {},
    "name": "Jack"
}
""".data(using: .utf8)!

do {
    let d = try JSONDecoder().decode(ClassB.self, from: json4)
} catch let err {
    print(err)
}

Мой вопрос: почему json4 нельзя декодировать? или как я могу декодировать json4?


person ZYiOS    schedule 06.07.2018    source источник


Ответы (2)


age в ClassA объявлен необязательным, поэтому ключ требуется, однако в JSON ageInfo пуст.

Ошибка

Нет значения, связанного с ключом CodingKeys(stringValue: "age")

Либо объявите age необязательным

var age: Int?

или вставьте пару ключ-значение в JSON

{
    "ageInfo": {"age" : 1},
    "name": "Jack"
}
person vadian    schedule 07.07.2018

Ваш ClassB имеет это:

var ageInfo: ClassA?

Но это не поможет вам с этим JSON:

"ageInfo": {}

Проблема в том, что ageInfo присутствует, но это также пустой словарь. Итак, существует ClassA, но он не соответствует вашему определению ClassA!

Сдача

class ClassA: Codable {
    var age: Int = 1
}

to

class ClassA: Codable {
    var age: Int? = 1
}
person matt    schedule 07.07.2018
comment
Ясно, значит, значение возраста по умолчанию бесполезно? Я думал, что "ageInfo": {} равно "ageInfo": null. - person ZYiOS; 08.07.2018
comment
Это было бы только в том случае, если бы null и empty-dictionary были одинаковыми. Они не. «Нет словаря вообще» — это не то же самое, что «пустой словарь». - person matt; 08.07.2018
comment
Точно так же в самом Swift nil и [:] — это две совершенно разные вещи. - person matt; 09.07.2018
comment
Так же и в реальной жизни. «Моя чашка пуста» — это не то же самое, что «у меня нет чашки». - person matt; 09.07.2018