Arhn - архитектура программирования

Проблема разбора/декодирования JSON из конечной точки API в объект структуры

Я пишу приложение Swift 5.x, используя Alamofire 5, чтобы получить список файлов из написанного мной API. API возвращает список файлов в виде объекта данных JSON. Затем я хочу получить эти данные в структуру, которую я создал. Я не могу заставить это работать. Вот пример строки JSON, которую мой сервер отправляет, когда вы попадаете в конечную точку API:

[{
    "ID": "0d37ee7a-39bf-4eca-b3ec-b3fe840500b5",
    "Name": "File01.iso",
    "Size": 6148
}, {
    "ID": "656e0396-257d-4604-a85c-bdd0593290cd",
    "Name": "File02.iso",
    "Size": 224917843
}, {
    "ID": "275fdf66-3584-4899-8fac-ee387afc2044",
    "Name": "File04.iso",
    "Size": 5549504
}, {
    "ID": "1c73f857-56b5-475b-afe4-955c9d2d87fe",
    "Name": "File05.iso",
    "Size": 15476866871
}, {
    "ID": "bfebbca2-49de-43d7-b5d0-3461b4793b62",
    "Name": "File06.iso",
    "Size": 37254264
}]

Я быстро создал следующую модель данных, чтобы удержать это:

struct Files: Decodable {
    let root: [File]
}

struct File: Decodable, Identifiable {
    var id: UUID
    var name: String
    var size: Int
}

enum CodingKeys: String, CodingKey {
    case id = "ID"
    case name = "Name"
    case size = "Size"
}

Затем я использовал Alamofire 5.x для вызова конечной точки API и попытался декодировать JSON и поместить его в рассматриваемый объект:

func getPackageFilesJSON() {
    AF.request("http://localhost:8080/api/v1/list/pkgs").responseDecodable(of: Files.self) { response in
        guard let serverFiles = response.value else {
            print("Error Decoding JSON")
            return
        }
        let self.serverFilesList = serverFiles
    }
}

Это не удается. Если я отлаживаю ответ, я получаю это для результата:

[Result]: failure(Alamofire.AFError.responseSerializationFailed(reason: Alamofire.AFError.ResponseSerializationFailureReason.decodingFailed(error: Swift.DecodingError.typeMismatch(Swift.Dictionary<Swift.String, Any>, Swift.DecodingError.Context(codingPath: [], debugDescription: "Expected to decode Dictionary<String, Any> but found an array instead.", underlyingError: nil)))))

Мне никогда не удавалось создавать эти модели данных и декодировать в них JSON. Я уверен, что упускаю что-то глупое. Я надеюсь, что кто-то более осведомленный, чем я, или вторая пара глаз может помочь мне заставить это работать.

Спасибо, Эд


Ответы:


1

В JSON нет ключа root. Объект root представляет собой массив

Удалить

struct Files: Decodable {
   let root: [File]
}  

и расшифровать

AF.request("http://localhost:8080/api/v1/list/pkgs").responseDecodable(of: [File].self) { response in ...

и переместите перечисление CodingKeys в структуру File

struct File: Decodable, Identifiable {
    var id: UUID
    var name: String
    var size: Int
    
    enum CodingKeys: String, CodingKey {
        case id = "ID"
        case name = "Name"
        case size = "Size"
    }
}
09.01.2021
  • Затем я получаю сообщение об ошибке (Alamofire.AFError.responseSerializationFailed (причина: Alamofire.AFError.ResponseSerializationFailureReason.decodingFailed (ошибка: Swift.DecodingError.keyNotFound (CodingKeys (stringValue: id, intValue: nil)), Swift.DecodingError.Context (codingPath: [_JSONKey) (stringValue: индекс 0, intValue: 0)], debugDescription: нет значения, связанного с ключом CodingKeys (stringValue: \id\, intValue: nil) (\id\)., baseError: nil))))) 09.01.2021
  • Перечисление CodingKeys должно быть внутри структуры File 09.01.2021
  • Перемещение перечисления внутри структуры сделало это. Изначально у меня не было структуры Files, но я добавил ее, когда она не работала. Рад, что мой первый инстинкт оказался верным и что это была простая проблема с кодированием. Я отмечу это как исключенное. 09.01.2021
  • Рекомендую научиться читать DecodingError сообщения. Они чрезвычайно описательные. 09.01.2021
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..