Как десериализовать JSON в Swift - PullRequest
0 голосов
/ 05 октября 2019

Я хочу декодировать файл JSON в объекты модели. К сожалению, это не работает правильно. Поэтому я не получаю ошибок, но «результат декодирования» не соответствует моим ожиданиям. У меня есть следующий файл JSON, и я хочу декодировать его в показанных структурах. Я урезал файл JSON. Почему я получаю только одно «изображение слайдера» вместо 5 (свойство imageSlider содержит массив только с первым изображением / элементом). Чего мне не хватает?

JSON:

[{"imageSlider" : [{
        "image" : [{
             "imageId" : "1",
             "imageName" : "germany1",
             "imageBigName" : "germany1_BIG",
             "imageRights" : "Peter"
        }],
        "image" : [{
             "imageId" : "2",
             "imageName" : "germany2",
             "imageBigName" : "germany2_BIG",
             "imageRights" : "Peter"
        }],
        "image" : [{
             "imageId" : "3",
             "imageName" : "germany3",
             "imageBigName" : "germany3_BIG",
             "imageRights" : "Peter"
        }],
        "image" : [{
             "imageId" : "4",
             "imageName" : "germany4",
             "imageBigName" : "germany4_BIG",
             "imageRights" : "Peter"
        }],
        "image" : [{
             "imageId" : "5",
             "imageName" : "germany5",
             "imageBigName" : "germany5_BIG",
             "imageRights" : "Peter"
        }]
    }]
}]

Swift:

struct CountryModel : Decodable, Equatable {    
    var countryName : String
    var inhabitants : String
    var capital : String
    var currency : String
    var imageName : String
    var imageSlider: [ImagesSlider]
}

struct ImagesSlider : Decodable, Equatable {
    var image: [Image]
}

struct Image : Decodable, Equatable {
    var imageId: String
    var imageName: String
    var imageBigName: String
    var imageRights: String
}

Расшифровка:

func loadData() -> [CountryModel] {
    var data: Data

    guard let file = Bundle.main.url(forResource: "data", withExtension: "json") else {
        fatalError("Error")
    }

    data = try! Data(contentsOf: file)
    let decoder = JSONDecoder()
    return try! decoder.decode([CountryModel].self, from: data)

}

Спасибо за вашу помощь ...

Редактировать: Мой вопрос не решен связанным вопросом ...

Ответы [ 2 ]

0 голосов
/ 05 октября 2019

Поскольку ваш JSON содержит несколько Images объектов с одним и тем же ключом ! Это недопустимо, и каждый перезаписывает другие (вероятно, случайно). Вы должны превратить этот json в массив объектов:

[{
    "imageSlider" : [{
        "image" : [{
            "imageId" : "1",
            "imageName" : "germany1",
            "imageBigName" : "germany1_BIG",
            "imageRights" : "Peter"
        }]},{
            "image" : [{
            "imageId" : "2",
            "imageName" : "germany2",
            "imageBigName" : "germany2_BIG",
            "imageRights" : "Peter"
        }]}
    }]
}]

Также должны быть представлены другие ключи CountryModel, так как все они не являются необязательными.

0 голосов
/ 05 октября 2019

JSON выглядит неправильно, помните, что у вас должен быть только один уникальный ключ для каждого объекта JSON. Прямо сейчас это:

[
  {
    "imageSlider": [
      {
        "image": [
          {
            "imageId": "1",
            "imageName": "germany1",
            "imageBigName": "germany1_BIG",
            "imageRights": "Peter"
          }
        ],
        "image": [
          {
            "imageId": "2",
            "imageName": "germany2",
            "imageBigName": "germany2_BIG",
            "imageRights": "Peter"
          }
        ]
      }
    ]
  }
]

И это должно быть так:

[
    {
      "imageSlider": [
        {
          "image": [
            {
              "imageId": "1",
              "imageName": "germany1",
              "imageBigName": "germany1_BIG",
              "imageRights": "Peter"
            },
            {
              "imageId": "2",
              "imageName": "germany2",
              "imageBigName": "germany2_BIG",
              "imageRights": "Peter"
            }
          ]
        }
      ]
    }
  ]

Обратите внимание, что элемент "germany2" находится внутри массива изображения.

let decoder = JSONDecoder()
let jsonData = Data(jsonString.utf8)
do {
  let country = try decoder.decode([CountryModel].self, from: jsonData)
  print(country[0].imageSlider[0].image.count)
} catch {
  print(error.localizedDescription)
}

// Console message
2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...