简体   繁体   English

在Swift4中从JSON解析填充模态时发现nil

[英]found nil while populating modal from JSON parsing in Swift4

I'd like to parse the following retrieved data using Swift 4. 我想使用Swift 4解析以下检索到的数据。

{"bannerCategory":{"name":"","apps":[{"ImageName":"enhancedWith3dTouch"},{"ImageName":"drSeussBanner"},{"ImageName":"indieGameBanner"},{"ImageName":"clashRoyaleBanner"}],"type":""},"categories":[{"name":"Best New Apps","apps":[{"Id":1,"Name":"Disney Build It: Frozen","Category":"Entertainment","Price":3.99,"ImageName":"frozen"},{"Name":"Spot - the best places according to experts and friends","Category":"Travel","ImageName":"spot"},{"Name":"Dine - More Dates, Not Swipes","Category":"Social Networking","ImageName":"dine"},{"Name":"Today: Habit tracker for your daily goals and routines","Category":"Health \& Fitness","ImageName":"today"},{"Id":1,"Name":"Disney Build It: Frozen","Category":"Entertainment","Price":3.99,"ImageName":"frozen"},{"Name":"Spot - the best places according to experts and friends","Category":"Travel","ImageName":"spot"},{"Name":"Dine - More Dates, Not Swipes","Category":"Social Networking","ImageName":"dine"},{"Name":"Today: Habit tracker for your daily goals a { “bannerCategory”:{ “名称”: “”, “应用程序”:[{ “ImageName”: “enhancedWith3dTouch”},{ “ImageName”: “drSeussBanner”},{ “ImageName”: “indieGameBanner”},{” ImageName“:” clashRoyaleBanner“}],” type“:”“},”类别“:[{” name“:”最佳新应用“,” apps“:[{” Id“:1,” Name“:”迪士尼Build It:“冻结”,“类别”:“娱乐”,“价格”:3.99,“ ImageName”:“ frozen”},{“名称”:“地点-根据专家和朋友的最佳推荐地点”,“类别“:” Travel“,” ImageName“:” spot“},{” Name“:”用餐-更多日期,不刷卡“,”类别“:”社交网络“,” ImageName“:”用餐“},{”名称”:“今天:您的日常目标和日常活动的习惯跟踪器”,“类别”:“健康状况”,“图像名称”:“今天”},{“ Id”:1,“名称”:“迪士尼制作”它:“冻结”,“类别”:“娱乐”,“价格”:3.99,“图片名称”:“冻结”},{“名称”:“地点-根据专家和朋友的最佳推荐地点”,“类别”: “旅行”,“图像名称”:“地点”},{“名称”:“用餐-更多日期,不刷卡”,“类别”:“社交网络”,“图像名称”:“用餐”},{“名称” :“今天:您日常目标的习惯追踪器 nd routines","Category":"Health \& 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":"Clash Royale","Category":"Games","ImageName":"clashroyale"},{"Name":"Beat Stomper","Category":"Games","Price":1.99,"ImageName":"beatstomper"}],"type":""},{"name":"50% Off for a Limited Time","apps":[{"ImageName":"luminocity"},{"ImageName":"theroom"},{"ImageName":"badland"},{"ImageName":"shadowmatic"},{"ImageName":"luminocity"},{"ImageName":"theroom"},{"ImageName":"badland"},{"ImageName":"shadowmatic"}],"type":"large" nd例程”,“类别”:“健康状况”,“ ImageName”:“今天”}],“类型”:“”},{“名称”:“最佳新游戏”,“应用”:[{ “ID”:2, “名称”: “telepaint”, “类别”: “游戏”, “价格”:2.99, “ImageName”: “telepaint”},{ “名称”: “狄拉克”, “分类”: “游戏”,“价格”: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 ”, “价格”:2.99, “ImageName”: “telepaint”},{ “名称”: “狄拉克”, “类别”: “游戏”, “价格”:1.99, “ImageName”: “狄拉克”},{ “ Name”:“ Clash Royale”,“ Category”:“ Games”,“ ImageName”:“ clashroyale”},{“ Name”:“ Beat Stomper”,“ Category”:“ Games”,“ Price”:1.99, “ ImageName”:“ beatstomper”}],“ type”:“”},{“ name”:“限时折扣50%”,“ apps”:[{“ ImageName”:“ luminocity”},{“ ImageName “:” 瞟着房间 “},{” ImageName “:” badland “},{” ImageName “:” shadowmatic “},{” ImageName “:” luminocity “},{” ImageName “:” 瞟着房间 “},{” ImageName “:” badland “},{” ImageName “:” shadowmatic “}],” 类型 “:” 大” },{"name":"More Games You Might Like","apps":[{"Name":"Summoners War","Category":"Games","ImageName":"summonerswar"},{"Name":"Angry Birds Space","Category":"Games","Price":0.99,"ImageName":"angrybirdsspace"},{"Name":"Star Wars™: Commander - Worlds in Conflict","Category":"Games","ImageName":"starwars"},{"Name":"Death Worm","Category":"Games","Price":2.99,"ImageName":"deathworm"}],"type":""}]} },{“ name”:“您可能喜欢的更多游戏”,“ apps”:[{“ Name”:“ Summoners War”,“ Category”:“ Games”,“ ImageName”:“ summonerswar”},{“ Name “:”“ Angry Birds Space”,“ Category”:“ Games”,“ Price”:0.99,“ ImageName”:“ angrybirdsspace”},{“ Name”:“ Star Wars™:Commander-Worlds in Conflict”,“ Category “:” Games“,” ImageName“:” starwars“},{” Name“:” Death Worm“,” Category“:” Games“,” Price“:2.99,” ImageName“:” deathworm“}],”类型”:””}]}

modal object to retrieve data 模态对象以检索数据

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?

        }   
     } 
}

codes for JSON parsing 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()
     } 
}

That yields the following output: 产生以下输出:

FeaturedApps(bannerCategory: Optional(JsonParseSwift4.FeaturedApps.AppCategory(name: Optional(""), apps: Optional([JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, category: nil, imageName: nil, price: nil), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, category: nil, imageName: nil, price: nil), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, category: nil, imageName: nil, price: nil), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, category: nil, imageName: nil, price: nil)]), type: Optional(""))), categories: Optional([JsonParseSwift4.FeaturedApps.AppCategory(name: Optional("Best New Apps"), apps: Optional([JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, category: nil, imageName: nil, price: nil), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, category: nil, imageName: nil, price: nil), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, category: nil, imageName: nil, FeaturedApps(bannerCategory:Optional(JsonParseSwift4.FeaturedApps.AppCategory(name:Optional(“”),apps:Optional([JsonParseSwift4.FeaturedApps.AppCategory.App(id:nil,name:nil,category:nil,imageName:nil,价格) :nil),JsonParseSwift4.FeaturedApps.AppCategory.App(id:nil,名称:nil,类别:nil,imageName:nil,价格:nil),JsonParseSwift4.FeaturedApps.AppCategory.App(id:nil,名称:nil,类别:nil,imageName:nil,价格:nil),JsonParseSwift4.FeaturedApps.AppCategory.App(id:nil,名称:nil,类别:nil,imageName:nil,价格:nil)]),类型:Optional(“”) )),类别:可选([JsonParseSwift4.FeaturedApps.AppCategory(名称:可选(“最佳新应用”),应用:可选([JsonParseSwift4.FeaturedApps.AppCategory.App(id:nil,名称:nil,类别:nil, imageName:nil,价格:nil),JsonParseSwift4.FeaturedApps.AppCategory.App(id:nil,名称:nil,category:nil,imageName:nil,价格:nil),JsonParseSwift4.FeaturedApps.AppCategory.App(id:nil,名称:无,类别:无,图像名称:无, price: nil), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, category: nil, imageName: nil, price: nil), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, category: nil, imageName: nil, price: nil), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, category: nil, imageName: nil, price: nil), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, category: nil, imageName: nil, price: nil), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, category: nil, imageName: nil, price: nil)]), type: Optional("")), JsonParseSwift4.FeaturedApps.AppCategory(name: Optional("Best New Games"), apps: Optional([JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, category: nil, imageName: nil, price: nil), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, category: nil, imageName: nil, price: nil), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, category: nil, imageName: nil, price: nil), 价格:nil),JsonParseSwift4.FeaturedApps.AppCategory.App(id:nil,名称:nil,类别:nil,imageName:nil,价格:nil),JsonParseSwift4.FeaturedApps.AppCategory.App(id:nil,名称:nil,类别:无,图像名称:无,价格:无),JsonParseSwift4.FeaturedApps.AppCategory.App(ID:无,名称:无,类别:无,图像名称:无,价格:无),JsonParseSwift4.FeaturedApps.AppCategory.App( id:nil,名称:nil,类别:nil,imageName:nil,价格:nil),JsonParseSwift4.FeaturedApps.AppCategory.App(id:nil,名称:nil,类别:nil,imageName:nil,价格:nil)] ),键入:Optional(“”)),JsonParseSwift4.FeaturedApps.AppCategory(name:Optional(“最佳新游戏”),apps:Optional([JsonParseSwift4.FeaturedApps.AppCategory.App(id:nil,name:nil,category :nil,imageName:nil,价格:nil),JsonParseSwift4.FeaturedApps.AppCategory.App(id:nil,名称:nil,类别:nil,imageName:nil,价格:nil),JsonParseSwift4.FeaturedApps.AppCategory.App(id :无,名称:无,类别:无,图像名称:无,价格:无), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, category: nil, imageName: nil, price: nil), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, category: nil, imageName: nil, price: nil), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, category: nil, imageName: nil, price: nil), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, category: nil, imageName: nil, price: nil), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, category: nil, imageName: nil, price: nil)]), type: Optional("")), JsonParseSwift4.FeaturedApps.AppCategory(name: Optional("50% Off for a Limited Time"), apps: Optional([JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, category: nil, imageName: nil, price: nil), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, category: nil, imageName: nil, price: nil), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, category: nil, imageName: nil, price: nil), Js JsonParseSwift4.FeaturedApps.AppCategory.App(id:nil,名称:nil,类别:nil,imageName:nil,价格:nil),JsonParseSwift4.FeaturedApps.AppCategory.App(id:nil,名称:nil,类别:nil,imageName :nil,价格:nil),JsonParseSwift4.FeaturedApps.AppCategory.App(id:nil,名称:nil,类别:nil,imageName:nil,价格:nil),JsonParseSwift4.FeaturedApps.AppCategory.App(id:nil,名称) :nil,类别:nil,图像名称:nil,价格:nil),JsonParseSwift4.FeaturedApps.AppCategory.App(id:nil,名称:nil,类别:nil,imageName:nil,价格:nil)]),类型:可选(“”)),JsonParseSwift4.FeaturedApps.AppCategory(名称:可选(“限时折扣50%”),apps:可选([JsonParseSwift4.FeaturedApps.AppCategory.App(id:nil,名称:nil,类别: nil,imageName:nil,价格:nil),JsonParseSwift4.FeaturedApps.AppCategory.App(id:nil,名称:nil,类别:nil,imageName:nil,价格:nil),JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil,名称:nil,类别:nil,图片名称:nil,价格:nil),Js onParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, category: nil, imageName: nil, price: nil), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, category: nil, imageName: nil, price: nil), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, category: nil, imageName: nil, price: nil), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, category: nil, imageName: nil, price: nil), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, category: nil, imageName: nil, price: nil)]), type: Optional("large")), JsonParseSwift4.FeaturedApps.AppCategory(name: Optional("More Games You Might Like"), apps: Optional([JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, category: nil, imageName: nil, price: nil), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, category: nil, imageName: nil, price: nil), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, category: nil, imageName: nil, price: nil), onParseSwift4.FeaturedApps.AppCategory.App(id:nil,名称:nil,类别:nil,imageName:nil,价格:nil),JsonParseSwift4.FeaturedApps.AppCategory.App(id:nil,名称:nil,类别:nil,imageName :nil,价格:nil),JsonParseSwift4.FeaturedApps.AppCategory.App(id:nil,名称:nil,类别:nil,imageName:nil,价格:nil),JsonParseSwift4.FeaturedApps.AppCategory.App(id:nil,名称) :nil,类别:nil,图像名称:nil,价格:nil),JsonParseSwift4.FeaturedApps.AppCategory.App(id:nil,名称:nil,类别:nil,imageName:nil,价格:nil)]),类型:可选(“大”)),JsonParseSwift4.FeaturedApps.AppCategory(名称:可选(“您可能喜欢的更多游戏”),应用程序:可选([JsonParseSwift4.FeaturedApps.AppCategory.App(id:nil,名称:nil,类别:nil ,imageName:nil,价格:nil),JsonParseSwift4.FeaturedApps.AppCategory.App(id:nil,名称:nil,category:nil,imageName:nil,价格:nil),JsonParseSwift4.FeaturedApps.AppCategory.App(id:nil ,名称:nil,类别:nil,图片名称:nil,价格:nil), JsonParseSwift4.FeaturedApps.AppCategory.App(id: nil, name: nil, category: nil, imageName: nil, price: nil)]), type: Optional(""))])) JsonParseSwift4.FeaturedApps.AppCategory.App(id:nil,名称:nil,类别:nil,imageName:nil,价格:nil)]),类型:Optional(“”))])))

Any pointers as to what I'm doing wrong and getting nil values ? 关于我在做什么错并得到nil值的任何指示吗?

The name of your properties should be the same as it is in the JSON response. 属性的名称应与JSON响应中的名称相同。 If a property uses different naming convention(case and/or spelling), it is treated as not found and is assigned a value of nil (if it is optional) or the program crashes (if it is required) 如果属性使用其他命名约定(大小写和/或拼写),则将其视为未找到,并分配值为nil(如果可选)或程序崩溃(如果需要)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM