Ios 无法从';任何';到更可选的类型';[字符串:AnyObject]?';

Ios 无法从';任何';到更可选的类型';[字符串:AnyObject]?';,ios,json,swift,api,serialization,Ios,Json,Swift,Api,Serialization,我正在尝试从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

我正在尝试从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?
}

在以下几行中,我得到了一个错误:

错误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”没有下标成员

如何删除这些错误?

尝试以下操作:

let json = try JSONSerialization.jsonObject(with: data!, options: []) as? [String:Any]
编辑:只有当json中的顶级对象实际上是字典而不是数组时,这才有效。如果您可以发布json响应的修订版本,这将非常有用


这段代码适用于您的url。

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

请阅读JSON。这很容易
{}
表示字典(
[String:Any]
在Swift中)、
[]
表示数组(
[[String:Any]]
)和
。在Swift中,可变容器
毫无意义

根对象是一个字典,key
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)
}

请检查您希望获得的JSON的根对象。let category=AppCategory(id:product[“product_id”]??“,这一行给出了错误:传递给调用的参数不带参数我不知道
AppCategory
对象的结构,所以我添加了一个简单的
struct
来提供一个有效的解决方案。我已经更新了json的问题并包含了类。类应用程序:NSObject{var product\u id:NSNumber?var product\u名称:字符串?var product\u描述:字符串?var图像\u url:字符串?var product\u价格:NSNumber?var名称:字符串?}1)类名与代码中的类不匹配2)您不需要
3)您不需要
NSNumber
4)您不需要选项5)变量名应该在Swift中用camelCased表示。-请尝试我建议的
结构