Swift.DecodingError.Context(codingPath:
Я декодирую строку JSON (Decoder) из URL repsonse следующим образом и получаю во время процесса декодирования следующие сообщения об ошибках:
Сообщение об ошибке:
typeMismatch(Swift.String, Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "values", intValue: nil), _JSONKey(stringValue: "Index 0", intValue: 0), CodingKeys(stringValue: "stat-list", intValue: nil), CodingKeys(stringValue: "stat", intValue: nil), _JSONKey(stringValue: "Index 0", intValue: 0), CodingKeys(stringValue: "timestamps", intValue: nil), _JSONKey(stringValue: "Index 0", intValue: 0)], debugDescription: "Expected to decode String but found a number instead.", underlyingError: nil))
Вот моя строка JSON из ответа:
{"values":[{"resourceId":"AAAAAA-3398-4280-8e32-BBBBBBBB","stat-list":{"stat":[{"timestamps":[1534186909854],"statKey":{"key":"cpu|underusedpercent"},"data":[25.0]},{"timestamps":[1538430850296],"statKey":{"key":"mem|consumedPct"},"data":[99.9984130859375]}]}}]}
Моя подходящая структура:
struct VrOpsObjectCpuRAMStatistics: Decodable
{
struct Values: Decodable
{
let resourceId: String
struct StatList: Decodable
{
struct Stat: Decodable
{
let timestamps: [String]
struct StatKey: Decodable
{
let key: String
}
let statKey: StatKey
let data: [String]
}
let stat: [Stat]
}
let statList: StatList
private enum CodingKeys: String, CodingKey
{
case resourceId
case statList = "stat-list"
}
}
let values: [Values]
}
Мой вызов декодирования с JSON-декодером:
self.vrOpsObjectCpuRamStatistics = try JSONDecoder().decode(VrOpsObjectCpuRAMStatistics.self , from: jsonData)
if self.vrOpsObjectCpuRamStatistics != nil
{
print("Data from REST call has been converted sucessfully to JSON Object" );
return (true, self.vrOpsObjectCpuRamStatistics);
}
else
{
return (false, "Decoding vRops data to JSON object has been failed!");
}
2 ответа
У вас есть эта ошибка, потому что вы пытаетесь декодировать метки времени как массив строк, но у вас есть массив целых чисел в JSON
У вас неправильная декларация формата.Вы можете попробовать с приведенным ниже кодом:
struct VrOpsObjectCpuRAMStatistics: Codable
{
struct Values: Codable
{
let resourceId: String
struct StatList: Codable
{
struct Stat: Codable
{
let timestamps: [Int]
struct StatKey: Codable
{
let key: String
}
let statKey: StatKey
let data: [Decimal]
}
let stat: [Stat]
}
let statList: StatList
private enum CodingKeys: String, CodingKey
{
case resourceId
case statList = "stat-list"
}
}
let values: [Values]
}
let decoder = JSONDecoder()
let vrOpsObjectCpuRamStatistics = try! decoder.decode(VrOpsObjectCpuRAMStatistics.self, from: jsonData)
if vrOpsObjectCpuRamStatistics != nil
{
//do
} else {
//....
}