"Данные не могут быть прочитаны, потому что они отсутствуют" при декодировании JSON в Swift

Я получаю следующую ошибку:

Данные не могут быть прочитаны, потому что они отсутствуют.

Когда я запускаю следующий код:

struct Indicator: Decodable {
    let section: String
    let key: Int
    let indicator: Int
    let threshold: Int
}
    var indicators = [Indicator]()

    do {
        if let file = Bundle.main.url(forResource: "indicators", withExtension: "json") {
            indicators = try JSONDecoder().decode([Indicator].self, from: try Data(contentsOf: file))
        }
    } catch {
        print(error.localizedDescription)
    }

Они находятся в функции, но я удалил их для ясности. У меня есть блок кода, который очень похож в другом файле (я скопировал этот код и существенно изменил имена), поэтому я не уверен, почему это происходит. Json файл действителен json и правильно настроен целевой объект.

Спасибо

Ответ 1

Я только что решил аналогичную проблему на моем конце, но для декодера списка свойств.

Ошибка в этом случае означает, что ключ не найден, а не данные в целом.

Попробуйте сделать переменные в своей структуре необязательными, и он должен вернуть значение nil, где проблема.

Ответ 2

Попробуйте напечатать фактическую ошибку, а не просто описание. Он должен дать вам сообщение типа "No value associated with key someKey (\"actual_key_if_you_defined_your_own\").", которое гораздо более полезно, чем localizedDescription.

Ответ 3

Печать error.localizedDescription вводит в заблуждение, поскольку отображает только совершенно бессмысленное общее сообщение об ошибке.

Поэтому никогда не используйте localizedDescription в Decodable блоках перехвата.

В простой форме просто

print(error)

Он показывает полную ошибку, включая важную информацию debugDescription и context. Decodable ошибки очень полны.


При разработке кода вы можете отлавливать каждую ошибку Decodable отдельно, например

} catch let DecodingError.dataCorrupted(context) {
    print(context)
} catch let DecodingError.keyNotFound(key, context) {
    print("Key '\(key)' not found:", context.debugDescription)
    print("codingPath:", context.codingPath)
} catch let DecodingError.valueNotFound(value, context) {
    print("Value '\(value)' not found:", context.debugDescription)
    print("codingPath:", context.codingPath)
} catch let DecodingError.typeMismatch(type, context)  {
    print("Type '\(type)' mismatch:", context.debugDescription)
    print("codingPath:", context.codingPath)
} catch {
    print("error: ", error)
}

Он показывает только самую значимую информацию.

Ответ 4

"Данные не могут быть прочитаны, потому что они отсутствуют"

ошибка, исходящая из этого кода:

...catch {
    print(error.localizedDescription)
}

Потому что: кажется, что ключ отсутствует или опечатка.

Вы можете проверить, какой ключ отсутствует, написав следующее:

...catch {
    debugPrint(error)
}

Примечание. Если ключи структуры отличаются от ключей данных JSON, см. Пример ниже: ключ в структуре - это "заголовок", а в данных - "имя".

struct Photo: Codable {
    var title: String
    var size: Size

    enum CodingKeys: String, CodingKey
    {
        case title = "name"
        case size
    }
}

Если вы неправильно наберете "имя", появится сообщение об ошибке.

Кроме того, если вы неправильно наберете "CodingKeys", вы получите ошибку.

enum CodingKeys:...