Нет значения, связанного с анализом ключа json - PullRequest
0 голосов
/ 13 декабря 2018

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

"results": {
    "datetime": [
        {
            "times": {
                "Imsak": "04:07",
                "Sunrise": "05:32",
                "Fajr": "04:17",
                "Dhuhr": "11:47",
                "Asr": "15:14",
                "Sunset": "18:02",
                "Maghrib": "18:16",
                "Isha": "19:13",
                "Midnight": "23:10"
            },
            "date": {
                "timestamp": 1544659200,
                "gregorian": "2018-12-13",
                "hijri": "1440-04-06"
            }
        }
    ],
    "location": {
        "latitude": -6.2375,
        "longitude": 106.69556,
        "elevation": 26,
        "city": "Ciputat",
        "country": "Republic of Indonesia",
        "country_code": "ID",
        "timezone": "Asia/Jakarta",
        "local_offset": 7
    }
}

Это моя модель Объект, где нет значения в ключе, связанном с городом, не имеют значения, но, как ни странно, если удалить местоположение VAR под результатами структуры и всеассоциирует, работает нормально, только местоположение - проблема.

struct PrayerModel: Decodable {
   var results: Results
}

struct Results: Decodable {
   var datetime: [DateTime]
   var location: Location
}

struct Location: Decodable {
   var city: String

init(dictionary: [String: String]) {
    self.city = dictionary["city"] ?? ""
  }
}

struct DateTime: Decodable {
   var times: Times
}

struct Times: Decodable {
  var Imsak: String
  var Sunrise: String
  var Fajr: String
  var Dhuhr: String
  var Asr: String
  var Sunset: String
  var Maghrib: String
  var Isha: String
  var Midnight: String

init(dictionary: [String: String]) {
    self.Imsak = dictionary["Imsak"] ?? ""
    self.Sunrise = dictionary["Sunrise"] ?? ""
    self.Fajr = dictionary["Fajr"] ?? ""
    self.Dhuhr = dictionary["Dhuhr"] ?? ""
    self.Asr = dictionary["Asr"] ?? ""
    self.Sunset = dictionary["Sunset"] ?? ""
    self.Maghrib = dictionary["Maghrib"] ?? ""
    self.Isha = dictionary["Isha"] ?? ""
    self.Midnight = dictionary["Midnight"] ?? ""
  }
}

Это где моя ошибка появляется, где ошибка?Я не могу понять это

Failed to decode data: keyNotFound(CodingKeys(stringValue: "city", intValue: nil), Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "results", intValue: nil), CodingKeys(stringValue: "location", intValue: nil)], debugDescription: "No value associated with key CodingKeys(stringValue: \"city\", intValue: nil) (\"city\").", underlyingError: nil))

1 Ответ

0 голосов
/ 13 декабря 2018

Это работает для меня, не знаю, почему вы используете init из словаря с Codable

import UIKit
import PlaygroundSupport

let jsonData = """
{ 
    "results": {
        "datetime": [{
            "times": {
                "Imsak": "04:07",
                "Sunrise": "05:32",
                "Fajr": "04:17",
                "Dhuhr": "11:47",
                "Asr": "15:14",
                "Sunset": "18:02",
                "Maghrib": "18:16",
                "Isha": "19:13",
                "Midnight": "23:10"
            },
            "date": {
                "timestamp": 1544659200,
                "gregorian": "2018-12-13",
                "hijri": "1440-04-06"
            }
        }],
        "location": {
            "latitude": -6.2375,
            "longitude": 106.69556,
            "elevation": 26,
            "city": "Ciputat",
            "country": "Republic of Indonesia",
            "country_code": "ID",
            "timezone": "Asia/Jakarta",
            "local_offset": 7
        }
    }
}
""".data(using: .utf8)!

struct PrayerModel: Decodable {
    var results: Results
}

struct Results: Decodable {
    var datetime: [DateTime]
    var location: Location
}

struct Location: Decodable {
    var city: String
}

struct DateTime: Decodable {
    var times: Times
}

struct Times: Decodable {
    var Imsak: String
    var Sunrise: String
    var Fajr: String
    var Dhuhr: String
    var Asr: String
    var Sunset: String
    var Maghrib: String
    var Isha: String
    var Midnight: String
}

do {
    let result = try JSONDecoder().decode(PrayerModel.self, from: jsonData)
    print(result)

    print("city: \(result.results.location.city)")
} catch {
    print(error)
}

Вывод:

PrayerModel (результаты: __lldb_expr_53.Results (datetime:[__lldb_expr_53.DateTime (времена: __lldb_expr_53.Times (Imsak: «04:07», восход солнца: «05:32», Fajr: «04:17», Dhuhr: «11:47», Asr: «15:14»)., Закат: "18:02", Магриб: "18:16", Иша: "19:13", полночь: "23:10"))], местоположение: __lldb_expr_53.Расположение (город: "Ciputat")))

город: Ciputat

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