Декодирование с использованием JSONDecoder Swift - PullRequest
0 голосов
/ 17 февраля 2019

Какая модель данных соответствует приведенному ниже json?

{ 
   dog:
   {
      type: "dog",
      logoLocation: "url1"
   },
   pitbull: 
   {
       type: "pitbull",
       logoLocation: "url2"
    }
}

Это словарь словарей. Итак, я попытался,

class PhotosCollectionModel: Codable {
    var photoDictionary: Dictionary<String, PhotoModel>?
}

class PhotoModel: Codable {
    var type: String?
    var logoLocation: String?
}

Но это не работает.Любая помощь, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Я бы пропустил первый класс и сохранил

class PhotoModel: Codable {
    var type: String
    var logoLocation: String
}

, а затем расшифровал его как словарь

do {
    let decoder = JSONDecoder()
    let result = try decoder.decode([String: PhotoModel].self, from: data)
    result.forEach { (key,value) in
        print("Type: \(value.type), logo: \(value.logoLocation) (key: \(key))")
    }
} catch  {
    print(error)
}

Выходы

Тип: собака,logo: url1 (ключ: собака)
Тип: pitbull, логотип: url2 (ключ: pitbull)

Действительно оба атрибута необязательны, если нет, я предлагаю вам удалить все ненужные ? вPhotoModel (Я сделал)

0 голосов
/ 17 февраля 2019

Вам нужно

struct Root: Codable {
    let dog, pitbull: Dog
}

struct Dog: Codable {
    let type, logoLocation: String  // or let logoLocation:URL
}

Правильный JSON

{
    "dog":
    {
        "type": "dog",
        "logoLocation": "url1"
    },
    "pitbull":
    {
        "type": "pitbull",
        "logoLocation": "url2"
    }
}

для динамического

просто используйте [String:Dog] в декодере

    do {

        let res  = try JSONDecoder().decode([String:Dog].self,from:data)
    }
    catch {

        print(error)
    }
...