无法从“Any”向下转换为更可选的类型“[String : AnyObject]?”

问题描述 投票:0回答:2

我正在尝试从 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”没有下标成员

如何消除这些错误?

ios json swift serialization
2个回答
1
投票

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

请阅读 JSON。这很容易。

{}
代表字典(Swift中为
[String:Any]
),
[]
代表数组(
[[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)
}

-3
投票

试试这个:

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

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

此代码适用于我的网址。

© www.soinside.com 2019 - 2024. All rights reserved.