我正在尝试从 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”没有下标成员
如何消除这些错误?
解析 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)
}
试试这个:
let json = try JSONSerialization.jsonObject(with: data!, options: []) as? [String:Any]
编辑:只有当 json 中的顶级对象实际上是字典而不是数组时,这才有效。如果您可以发布 json 响应的编辑版本,将会很有帮助。
此代码适用于我的网址。