JSON "Any" 不能转换为 'NSDictionary' 以及如何确定转换类型
Posted
技术标签:
【中文标题】JSON "Any" 不能转换为 \'NSDictionary\' 以及如何确定转换类型【英文标题】:JSON "Any" is not covertible to 'NSDictionary' and how to decide the casting typeJSON "Any" 不能转换为 'NSDictionary' 以及如何确定转换类型 【发布时间】:2017-05-12 00:57:13 【问题描述】:我一直在研究这个项目的核心数据。 我需要从 json 文件中检索数据,然后将某些数据放入核心数据中。但是,我卡在类型转换上。
[![do
let][1]][1] jsonDict = try JSONSerialization.jsonObject(with: jsonData!, options: .allowFragments) as! NSDictionary
let jsonArray = jsonDict.value(forKeyPath: "response.venues") as! NSArray
for jsonDictionary: NSDictionary in jsonArray
let venueName = jsonDictionary["name"] as? String
let venuePhone = (jsonDictionary as AnyObject).value(forKeyPath: "contact.phone") as? String
let specialCount = (jsonDictionary as AnyObject).value(forKeyPath: "specials.count") as? NSNumber
let locationDict = jsonDictionary["location"] as! NSDictionary
let priceDict = jsonDictionary["price"] as! NSDictionary
let statsDict = jsonDictionary["stats"] as! NSDictionary
let location = Location(entity: locationEntity!, insertInto: coreDataStack.context)
location.address = locationDict["address"] as? String
location.city = locationDict["city"] as? String
location.state = locationDict["state"] as? String
location.zipcode = locationDict["postalCode"] as? String
location.distance = locationDict["distance"] as? NSNumber
let category = Category(entity: categoryEntity!, insertInto: coreDataStack.context)
let priceInfo = PriceInfo(entity: priceEntity!, insertInto: coreDataStack.context)
priceInfo.priceCategory = priceDict["currency"] as? String
let stats = Stats(entity: statsEntity!, insertInto: coreDataStack.context)
stats.checkinsCount = statsDict["checkinsCount"] as? NSNumber
stats.usersCount = statsDict["userCount"] as? NSNumber
stats.tipCount = statsDict["tipCount"] as? NSNumber
let venue = Venue(entity: venueEntity!, insertInto: coreDataStack.context)
venue.name = venueName
venue.phone = venuePhone
venue.specialCount = specialCount
venue.location = location
venue.category = category
venue.priceInfo = priceInfo
venue.stats = stats
我的 JSON 树也在这里:
我已经尝试了几个下标,这根本不起作用。如何解决这个问题?提前致谢。
【问题讨论】:
【参考方案1】:1) 尝试使用[Any]
代替NSArray
和[String:Any]
代替NSDictionary
2) 您可能需要从response
中提取venues
像 Swift 3 中这样:
do
let jsonDict = try JSONSerialization.jsonObject(with: jsonData!, options: .allowFragments) as! [String:Any]
let jsonResponseArray = jsonDict["response"] as! [Any]
let jsonVenueArray = jsonResponseArray["venues"] as! [String:Any]
for venue: [String:Any] in jsonVenueArray
...
catch
print("Error:", error)
【讨论】:
Swift 3 字典原生值类型应该是Any
而不是 AnyObject
。 BTW Dictionary 没有value(forKeyPath:)
方法
@LeoDabus Any 和 AnyObject 有点令人困惑。在这种情况下使用 AnyObject 将不起作用?
String、Float、Double 是结构体,AnyObject 是所有类都隐式遵守的协议(不是结构体)。如果使用 AnyObject 所有的 Double、Float、Int 都会转换为 NSNumber
@LeoDabus 明白了!我改变了答案。
不要忘记使用do try catch
错误处理来处理错误或使用try?
返回一个可选而不处理错误if let dict = (try? JSONSerialization.jsonObject(with: jsonData)) as? [String:Any]
以上是关于JSON "Any" 不能转换为 'NSDictionary' 以及如何确定转换类型的主要内容,如果未能解决你的问题,请参考以下文章