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    {
        //....            
}
Другие вопросы по тегам