我在解析这个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的人,Google是。所以请不要恨。

最佳答案

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

10-07 15:27