Ios 无法从';任何';到更可选的类型';[字符串:AnyObject]?';
我正在尝试从url获取json。当序列化json时,它会给出错误吗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
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中,可变容器
毫无意义
根对象是一个字典,keyproducts
的值是一个数组
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表示。-请尝试我建议的结构
。