Не удалось декодировать JSON - PullRequest
0 голосов
/ 11 ноября 2018

привет, я хочу получить данные json, данные json такие

"items":[  
  {  
     "date_for":"2018-11-11",
     "fajr":"5:28 am",
     "shurooq":"6:37 am",
     "dhuhr":"11:52 am",
     "asr":"2:40 pm",
     "maghrib":"5:06 pm",
     "isha":"6:15 pm"
  }
],

Чем я могу декодировать для JSONDecoder, как это:

struct PrayerModel: Decodable {
var items: [Items]
}

struct Items: Decodable {
var fajr: String
var dhuhr: String
var asr: String
var maghrib: String
var isha: String

init(dictionary: [String: String]) {
    self.fajr = dictionary["fajr"] ?? ""
    self.dhuhr = dictionary["dhuhr"] ?? ""
    self.asr = dictionary["asr"] ?? ""
    self.maghrib = dictionary["maghrib"] ?? ""
    self.isha = dictionary["isha"] ?? ""
  }
}

и затем я создаю объект для хранения декодируемых данных:

struct Prayer {
var prayerName: String
var prayerIcon: UIImage
var prayerTime: String

init(prayerName: String, prayerIcon: UIImage, prayerTime: String) {
    self.prayerName = prayerName
    self.prayerIcon = prayerIcon
    self.prayerTime = prayerTime
 }
}

и получить его с помощью URLSession:

do {
     let prayerData = try JSONDecoder().decode(PrayerModel.self, from: data)

     prayerData.items.forEach({ (item) in
     let isya = Prayer(prayerName: "Isya", prayerIcon: #imageLiteral(resourceName: "Clear"), prayerTime: item.isha)
     self.prayers.append(contentsOf: [shubuh, dzuhur, ashar, maghrib, isya])
      })
        DispatchQueue.main.async {
        self.tableView.reloadData()
       }
            } catch let decodeErr {
                print("Failed to decode:", decodeErr)
            }

и я получил это ошибка

Не удалось декодировать: dataCorrupted (Swift.DecodingError.Context (codingPath: [], debugDescription: «Данные недопустимы в формате JSON.», UnderError: Необязательно (Ошибка домена = NSCocoaErrorDomain Code = 3840) Текст JSON не запустился) с массивом или объектом и параметром, позволяющим не задавать фрагменты. "UserInfo = {NSDebugDescription = Текст JSON не начинался с массива или объекта, а также параметр, позволяющий не задавать фрагменты.})))

где проблема для моего кода, кто-нибудь может помочь?

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Как я уже упоминал в своем комментарии, сообщение json неверно, я добавил {} к нему, и оно работало нормально.

{ "элементы": [{
"Date_for": "2018-11-11", "фаджр": "5:28 утра", "shurooq": "6:37 утра", "dhuhr": "11:52 утра", "asr": "2:40 вечера", "Магриб": "5:06 вечера", "иша": "6:15 вечера"
}] }

И вам не нужно включать все элементы в сообщение json, если вы не хотите их использовать, я удалил метод init() из Items, поскольку он не используется.

struct Items: Decodable {
  var fajr: String
  var dhuhr: String
  var asr: String
  var maghrib: String
  var isha: String
}

Тогда он прекрасно работал с кодом ниже

let str = "{\"items\":[{\"date_for\":\"2018-11-11\",\"fajr\":\"5:28 am\",\"shurooq\":\"6:37 am\",\"dhuhr\":\"11:52 am\",\"asr\":\"2:40 pm\",\"maghrib\":\"5:06 pm\",\"isha\":\"6:15 pm\"}]}"

do {
  if let data = str.data(using: .utf8) {
    let prayerData = try JSONDecoder().decode(PrayerModel.self, from: data)
    for item in prayerData.items {
      print(item)
    }
  }
} catch let decodeErr {
  print("Failed to decode:", decodeErr)
}
0 голосов
/ 11 ноября 2018

Если вы хотите использовать прототип Decodable с вашим JSON, переменные должны иметь одно и то же имя и включать все элементы с одинаковым положением.

Попробуйте это:

var date_for: String
var fajr: String
var shurooq: String
var dhuhr: String
var asr: String
var maghrib: String
var isha: String

init(dictionary: [String: String]) {
    self.date_for = dictionary["date_for"] ?? ""
    self.fajr = dictionary["fajr"] ?? ""
    self.shurooq = dictionary["shurooq"] ?? ""
    self.dhuhr = dictionary["dhuhr"] ?? ""
    self.asr = dictionary["asr"] ?? ""
    self.maghrib = dictionary["maghrib"] ?? ""
    self.isha = dictionary["isha"] ?? ""
}
...