我的 NSJSONSerialization 似乎给了我嵌套的 NSDictionaries——如何访问外部键中的特定键?

Posted

技术标签:

【中文标题】我的 NSJSONSerialization 似乎给了我嵌套的 NSDictionaries——如何访问外部键中的特定键?【英文标题】:My NSJSONSerialization seems like it's giving me nested NSDictionaries--how can I access specific keys within the outside key? 【发布时间】:2015-08-04 18:45:47 【问题描述】:

我希望我正确地表达了我的问题,如果我没有正确表达我的歉意。不完全确定发生了什么。

所以我用

解析了 JSON
let jsonData:NSDictionary = NSJSONSerialization.JSONObjectWithData(responseData!, options: NSJSONReadingOptions.MutableContainers, error: &errors) as! NSDictionary

产生:


"tests" =     (
            
        age = 50;
        gender = m;
        vehicle = 1;
    ,
            
        age = 73;
        gender = m;
        vehicle = 14;
    ,
            
        age = 50;
        gender = m;
        vehicle = 22;
    ,
            
        age = 50;
        gender = m;
        vehicle = 23;
    , 

。 . .

当我打印 (jsonData["tests"] 时,我得到的结果与 NSArray 基本相同,除了没有 "tests ..." ——除此之外它看起来几乎相同。

我想用每个元素的“车辆”条目填充一个 tableView,那么我怎样才能获得一个数组或仅用每个元素的“车辆”条目可用的东西。使用原始 NSDictionary 打印 allKeys 时,我得到的唯一“键”是“测试”,我不能将 jsonData[“tests”] 转换为 NSDictionary 来生成“年龄、性别……”等新键

tl;博士我怎样才能从 NSDictionary “jsonData”转到一个看起来像 [1, 14, 22, 23] 的车辆编号数组。

有什么建议吗?

【问题讨论】:

【参考方案1】:

看起来您的 json 是一个包含字典数组的字典,因此您应该能够将来自 jsonData["tests"] 的内容转换为数组,然后使用 .map() 创建一个仅包含车辆的数组像这样的数字:

if let dictArray = jsonData["tests"] as? [[String: AnyObject]] 
  var vehicleArray = dictArray.map( dict in
            dict["vehicle"]     
  )
  //Do something with vehicle array here

【讨论】:

我遇到了一些问题。 dict["vehicle"] 部分中的 dict 抛出语法错误。然而,即使修复了,它也没有按照我想要的方式工作。我可能忽略了一些东西。 @ksm18 嗯,奇怪,当我在操场上打印时,它打印出一系列车辆,但我没有从 json 创建它,只是作为字典数组。您看到了什么问题? 让它工作: var vehicleArray = dictArray.map(dict in dict["vehicle"]) --你少了一个括号。我之前也说错了。我最终使用了您的回复,而不是其他回复。【参考方案2】:

到目前为止,您已经通过将具有单个键/值对的字典解包到值中来完成工作。

但是,您实际上并不需要或不想从您现在拥有的数组中创建一个单独的数组。只需在表 dataSource 函数中使用正确的映射即可。将其保存为字典对象数组。

if let a = jsonData["tests"] as? [[String: AnyObject]] 
   myPersonArray = a

else  /* handle error */ 
// later

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
  // get the cell, then:
  let vehicleNum = myPersonArray[indexPath.row]["vehicle"] as! Int
  cell.text = "\(vehicleNum)"
  // whatever else, then return the cell

【讨论】:

以上是关于我的 NSJSONSerialization 似乎给了我嵌套的 NSDictionaries——如何访问外部键中的特定键?的主要内容,如果未能解决你的问题,请参考以下文章

NSJSONSerialization 不解析 NSManagedObject

NSJSONSerialization 拆箱 NSNumber?

iOS 5 中的 NSJSONSerialization 类似于 c# 序列化到类

不同格式的 NSJSONSerialization 数据

iOS:NSJSONSerialization:错误的代码或错误的 JSON 结构?

在 iOS 中使用 NSJSONSerialization 时是不是有数据限制?