【问题标题】:Cannot downcast from 'Any' to a more optional type '[String : AnyObject]?'不能从“Any”向下转换为更可选的类型“[String : AnyObject]?”
【发布时间】:2018-04-18 05:11:35
【问题描述】:

我正在尝试从 url 获取 json。虽然序列化 json 它给出了错误?

 static func fetchFeatureApp(){
            let urlString="http://ebmacs.net/ubereats/Api/all_product?id=1"
            let url = URL(string: urlString)!

         URLSession.shared.dataTask(with: URLRequest(url: url)){ (data, responce, error) in
            if error != nil
                {
                    print(error)
                    return
                }
                do{
                   let json=try (JSONSerialization.jsonObject(with: data!, options: .mutableContainers)) //as! [String:AnyObject]?//as! [AnyObject]?//as! String? //as! [String:AnyObject]//as! [String: Any]
 //////////Error here

                    //let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [String: Any] //program is crashing 
                    var appCategories=[AppCategory]()
                    for dict in json["products"] as! [[String :AnyObject]]{///////Error Here
                        let appCategory = AppCategory()
                        appCategory.setValuesForKeys(dict)
                        appCategories.append(appCategory)
                    }
                    print(appCategories)
                }catch let err{
                    print(error)
                }
            }.resume()

        }

Json 的类是

class App:NSObject  {
    var product_id:NSNumber?
    var product_name:String?
    var product_description:String?
    var image_url:String?
    var product_price:NSNumber?
    var name:String?
}

image description here

在以下几行我收到错误:

错误 1:

 `let json=try (JSONSerialization.jsonObject(with: data!, options: .mutableContainers)) //as! [String:AnyObject]?//as! [AnyObject]?//as! String? //as! [String:AnyObject]//as! [String: Any]`

不能从 'Any' 向下转换为更可选的类型 '[String : 任何对象]?'

错误 2:

for dict in json["products"] as! [[String :AnyObject]]{ /////////////error

类型 'Any' 没有下标成员

如何消除这些错误?

【问题讨论】:

  • 请检查您希望获得的 JSON 的根对象。

标签: ios json swift api serialization


【解决方案1】:

解析 JSON 的推荐方法是使用可选绑定安全地解包可选。

请阅读 JSON。这很容易。 {} 代表一个字典([String:Any] 在 Swift 中),[] 一个数组([[String:Any]])和.mutableContainers 在 Swift 中无论如何都是无稽之谈。

根对象是一个字典,键products的值是一个数组

struct AppCategory {
    let id, name, description, url, price : String
}

do {
    if let jsonResult = try JSONSerialization.jsonObject(with:data!) as? [String:Any] {
        if let products = jsonResult["products"] as? [[String:String]] {
            var appCategories = [AppCategory]()
            for product in products {
                let category = AppCategory(id: product["product_id"] ?? "",
                                           name: product["product_name"] ?? "",
                                           description: product["product_description"] ?? "",
                                           url: product["image_url"] ?? "",
                                           price: product["product_price"] ?? "")
                appCategories.append(category)
            }
            print(appCategories)
        }
    }
} catch {
    print(error)
}

【讨论】:

  • let category = AppCategory(id: product["product_id"] ?? "", 此行给出错误:传递给不带参数的调用的参数
  • 我不知道你的AppCategory 对象的结构,所以我添加了一个简单的struct 来提供一个可行的解决方案。
  • 我已经更新了问题并包含了 json 的类 .class App:NSObject { var product_id:NSNumber? var 产品名称:字符串? var product_description:字符串? var image_url:字符串? var product_price:NSNumber?变量名称:字符串? }
  • 1) 类名与代码中的类不匹配 2) 你不需要class 3) 你不需要NSNumber 4) 你不需要选项 5) 变量名在 Swift 中应该是 camelCased。 - 请试试我建议的struct
【解决方案2】:

试试这个:

let json = try JSONSerialization.jsonObject(with: data!, options: []) as? [String:Any]

编辑:仅当您的 json 中的顶级对象实际上是字典而不是数组时,这才有效。如果您可以发布您的 json 响应的编辑版本,将会很有帮助。

此代码适用于您的网址。

【讨论】:

    猜你喜欢
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-08
    • 1970-01-01
    • 2023-01-18
    • 2021-10-19
    • 2014-10-16
    相关资源
    最近更新 更多