【问题标题】:found nil while populating modal from JSON parsing in Swift4在 Swift4 中从 JSON 解析填充模态时发现 nil
【发布时间】: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 值的任何指针?

【问题讨论】:

  • 请比较键和对应的属性。提示:区分大小写很重要。捕获错误的另一种方法是将属性声明为非可选。

标签: json swift swift4


【解决方案1】:

您的属性名称应与 JSON 响应中的名称相同。如果属性使用不同的命名约定(大小写和/或拼写),则将其视为未找到并分配 nil 值(如果它是可选的)或程序崩溃(如果它是必需的)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    相关资源
    最近更新 更多