ValueForKeyPath()返回意外的东西

时间:2014-08-07 12:50:56

标签: ios json swift nsdictionary

我正在解析这个json:

{
"destination_addresses" : [ "Göteborg, Sverige" ],
"origin_addresses" : [ "Stockholm, Sverige" ],
"rows" : [
   {
      "elements" : [
         {
            "distance" : {
               "text" : "467 km",
               "value" : 466568
            },
            "duration" : {
               "text" : "4 timmar 34 min",
               "value" : 16468
            },
            "status" : "OK"
         }
      ]
   }
],
"status" : "OK"
}

像这样的NSDictionary

let dataDict = NSJSONSerialization.JSONObjectWithData(data.dataUsingEncoding(NSUTF8StringEncoding), options: nil, error: nil) as NSDictionary

let distance = dataDict.valueForKeyPath("rows.elements.distance.value")

现在,这可行,没有崩溃或错误。但是,我希望它返回466568,但它会返回:

(
        (
        466568
    )
)

我不知道为什么我无法使用它并且无法将其投入任何东西:(

还有另一个与此类似的问题,但那里的答案并没有帮助我,因为我不是改变json的人,谷歌是。所以请不要讨厌。

2 个答案:

答案 0 :(得分:2)

valueForKeyPath正在返回嵌套的NSArray。你可能想要投两次:

let distanceValue = ((distance as NSArray).objectAtIndex(0) as NSArray).objectAtIndex(0) as NSNumber
// or
let distanceValue = (distance as [NSArray])[0][0] as NSNumber

distance值无法直接访问,因为valueForKeyPath没有为数组项实现选择器。

没有valueForKeyPath

let rows = dataDict.objectForKey("rows") as [NSDictionary]
let elements = rows[0]["elements"] as [NSDictionary]
let distance = elements[0]["distance"] as NSDictionary
let value = distance["value"] as NSNumber

答案 1 :(得分:0)

这可能是因为行为您提供数组而不是字典。所以首先得到行的值,它会给你一个数组。获取数组零索引处的对象并将其指定给Dictionary,然后尝试获取elements.distance.value