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' 以及如何确定转换类型的主要内容,如果未能解决你的问题,请参考以下文章

获取本地 JSON 数据:元素隐含类型为“any”

对象不能从 DBNull 转换为其他类型。

json对象在java中怎么修改value的值

php 处理json字符串

vue使用ts时总是用any

php转换成json数据格式