解码失败 json
Failed to decode json
你好我想检索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)
}
我得到了这个错误
Failed to decode: dataCorrupted(Swift.DecodingError.Context(codingPath: [], debugDescription: "The given data was not valid JSON.", underlyingError: Optional(Error Domain=NSCocoaErrorDomain Code=3840 "JSON text did not start with array or object and option to allow fragments not set." UserInfo={NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.})))
我的代码哪里有问题,有人可以帮忙吗?
如果您想将 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"] ?? ""
}
正如我在评论中提到的,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"
}]
}
如果您不想使用它们,则不必在 json 消息中包含所有元素,我从 Items
中删除了 init()
方法,因为它不是用过的。
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)
}
你好我想检索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)
}
我得到了这个错误
Failed to decode: dataCorrupted(Swift.DecodingError.Context(codingPath: [], debugDescription: "The given data was not valid JSON.", underlyingError: Optional(Error Domain=NSCocoaErrorDomain Code=3840 "JSON text did not start with array or object and option to allow fragments not set." UserInfo={NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.})))
我的代码哪里有问题,有人可以帮忙吗?
如果您想将 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"] ?? ""
}
正如我在评论中提到的,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"
}] }
如果您不想使用它们,则不必在 json 消息中包含所有元素,我从 Items
中删除了 init()
方法,因为它不是用过的。
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)
}