我正在解析这个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的人,谷歌是。所以请不要讨厌。
答案 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