"The data couldn’t be read because it is missing" error when decoding JSON in Swift

Solution 1:

Printing error.localizedDescription is misleading because it displays only a quite meaningless generic error message.

So never use localizedDescription in Decodable catch blocks.

In the simple form just

print(error)

It shows the full error including the crucial information debugDescription and context.Decodable errors are very comprehensive.


While developing code you could catch each Decodable error separately for example

} 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)
}

It shows only the most significant information.

Solution 2:

I just solved a similar issue on my end but for the property list decoder.

The error in this case seems to mean that a key wasn't found and not the data as a whole.

Try making the variables in your struct optional and it should return a nil value where the problem lies.