【发布时间】:2017-11-27 08:45:58
【问题描述】:
我想使用 Swift 4 解析以下检索到的数据。
{"bannerCategory":{"name":"","apps":[{"ImageName":"enhancedWith3dTouch"},{"ImageName":"drSeussBanner"},{"ImageName":"indieGameBanner"} ,{"ImageName":"clashRoyaleBanner"}],"type":""},"categories":[{"name":"Best 新应用","apps":[{"Id":1,"Name":"Disney Build It: Frozen","Category":"Entertainment","Price":3.99,"ImageName":"frozen"},{"Name":"Spot - 专家和朋友推荐的最佳地点","Category":"Travel","ImageName":"spot"},{"Name":"Dine - More 日期,而不是滑动”,“类别”:“社交 Networking","ImageName":"dine"},{"Name":"Today: 习惯追踪器 每日目标和例程","类别":"健康 \u0026 Fitness","ImageName":"today"},{"Id":1,"Name":"Disney Build It: Frozen","Category":"Entertainment","Price":3.99,"ImageName":"frozen"},{"Name":"Spot - 专家和朋友推荐的最佳地点","Category":"Travel","ImageName":"spot"},{"Name":"Dine - More 日期,而不是滑动”,“类别”:“社交 Networking","ImageName":"dine"},{"Name":"Today: 习惯追踪器 每日目标和例程","类别":"健康 \u0026 Fitness","ImageName":"today"}],"type":""},{"name":"Best New Games","apps":[{"Id":2,"Name":"Telepaint","Category":"Games","Price":2.99,"ImageName":"telepaint"},{"Name" :"Dirac","Category":"Games","Price":1.99,"ImageName":"dirac"},{"Name":"Clash Royale","Category":"Games","ImageName":"clashroyale"},{"Name":"Beat Stomper","Category":"Games","Price":1.99,"ImageName":"beatstomper"},{"Id":2,"Name":"Telepaint","Category":"Games"," Price":2.99,"ImageName":"telepaint"},{"Name":"Dirac","Category":"Games","Price":1.99,"ImageName":"dirac"},{"Name" :“冲突 Royale","Category":"Games","ImageName":"clashroyale"},{"Name":"Beat Stomper","Category":"Games","Price":1.99,"ImageName":"beatstomper"}],"type":""},{"name":"50% 限时关闭 Time","apps":[{"ImageName":"luminocity"},{"ImageName":"theroom"},{"ImageName":"badland"},{"ImageName":"shadowmatic"},{" ImageName":"luminocity"},{"ImageName":"theroom"},{"ImageName":"badland"},{"ImageName":"shadowmatic"}],"type":"large"},{"名称":"更多 您可能喜欢的游戏","apps":[{"Name":"Summoners War","Category":"Games","ImageName":"summonerswar"},{"Name":"Angry 鸟类 Space","Category":"Games","Price":0.99,"ImageName":"angrybirdsspace"},{"Name":"Star Wars™:指挥官 - 世界 冲突","类别":"游戏","ImageName":"星球大战"},{"名称":"死亡 Worm","Category":"Games","Price":2.99,"ImageName":"deathworm"}],"type":""}]}
检索数据的模态对象
struct FeaturedApps: Codable {
var bannerCategory: AppCategory?
var categories: [AppCategory]?
struct AppCategory: Codable {
let name : String?
let apps : [App]?
let type: String?
struct App : Codable {
let id: Int?
let name: String?
let category : String?
let imageName : String?
let price : Float?
}
}
}
JSON 解析代码
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let jsonUrl = "https://api.letsbuildthatapp.com/appstore/featured"
guard let url = URL(string: jsonUrl) else { return }
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
guard let data = data else { return }
if let error = error {
print(error)
return
}
do {
let courses = try JSONDecoder().decode(FeaturedApps.self, from: data)
print(courses)
} catch let jsonErr {
print("Error serializing json:", jsonErr)
}
}
task.resume()
}
}
产生以下输出:
FeaturedApps(bannerCategory: 可选(JsonParseSwift4.FeaturedApps.AppCategory(名称:可选(“”), 应用程序:可选([JsonParseSwift4.FeaturedApps.AppCategory.App(id:nil, 名称:无,类别:无,图像名称:无,价格:无), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, 类别:无,图像名称:无,价格:无), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, 类别:无,图像名称:无,价格:无), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, 类别:无,图像名称:无,价格:无)]),类型:可选(“”))), 类别:可选([JsonParseSwift4.FeaturedApps.AppCategory(名称: 可选(“最佳新应用”),应用: 可选([JsonParseSwift4.FeaturedApps.AppCategory.App(id:nil,名称: 无,类别:无,图像名称:无,价格:无), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, 类别:无,图像名称:无,价格:无), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, 类别:无,图像名称:无,价格:无), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, 类别:无,图像名称:无,价格:无), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, 类别:无,图像名称:无,价格:无), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, 类别:无,图像名称:无,价格:无), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, 类别:无,图像名称:无,价格:无), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, 类别:无,图像名称:无,价格:无)]),类型:可选(“”)), JsonParseSwift4.FeaturedApps.AppCategory(name: Optional("Best New 游戏”),应用程序: 可选([JsonParseSwift4.FeaturedApps.AppCategory.App(id:nil,名称: 无,类别:无,图像名称:无,价格:无), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, 类别:无,图像名称:无,价格:无), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, 类别:无,图像名称:无,价格:无), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, 类别:无,图像名称:无,价格:无), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, 类别:无,图像名称:无,价格:无), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, 类别:无,图像名称:无,价格:无), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, 类别:无,图像名称:无,价格:无), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, 类别:无,图像名称:无,价格:无)]),类型:可选(“”)), JsonParseSwift4.FeaturedApps.AppCategory(name: Optional("50% Off for a 限时”),应用程序: 可选([JsonParseSwift4.FeaturedApps.AppCategory.App(id:nil,名称: 无,类别:无,图像名称:无,价格:无), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, 类别:无,图像名称:无,价格:无), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, 类别:无,图像名称:无,价格:无), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, 类别:无,图像名称:无,价格:无), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, 类别:无,图像名称:无,价格:无), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, 类别:无,图像名称:无,价格:无), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, 类别:无,图像名称:无,价格:无), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, 类别:无,图像名称:无,价格:无)]),类型: 可选(“大”)),JsonParseSwift4.FeaturedApps.AppCategory(名称: 可选(“您可能喜欢的更多游戏”),应用程序: 可选([JsonParseSwift4.FeaturedApps.AppCategory.App(id:nil,名称: 无,类别:无,图像名称:无,价格:无), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, 类别:无,图像名称:无,价格:无), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, 类别:无,图像名称:无,价格:无), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, 类别:无,图像名称:无,价格:无)]),类型:可选(“”))]))
关于我做错了什么并获得 nil 值的任何指针?
【问题讨论】:
-
请比较键和对应的属性。提示:区分大小写很重要。捕获错误的另一种方法是将属性声明为非可选。