如何在Swift中操作嵌套字典,例如JSON数据?

14

我正在使用NSJSONSerialization在Swift应用程序中解析JSON。然而,返回的字典由于嵌套结构复杂,使得非常长的类型声明(例如 Dictionary<String, Array<Dictionary<String, ....>>)不切实际。

有没有一种好的方法在Swift中处理这样的结构,其中集合的结构非常复杂,其类型直到运行时才知道?

3个回答

12

只需将json数据引用为NSDictionary:

var dict: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary

然后您可以使用下标引用它:

var myValue: NSString = dict["level1"]["level2"]

1
谢谢!直接使用NSDictionary很有帮助。但是,我认为它没有实现下标:我必须调用objectForKey - Bill
1
我也遇到了同样的问题。我需要在内部项目上调用objectForKey才能访问它们。如果不这样做,似乎不仅会出现问题,而且还会导致Xcode 6崩溃... - tibbon
这对我不起作用。我有var dict:NSDictionary = NSDictionary(contentsOfFile:"some/path"); var deepValue = conjugationTable["level1"]["level2"]["level3"]编译器抱怨它“找不到接受提供的参数的下标重载。” - NRitH
我刚遇到了这个问题,使用Xcode 6 Beta 4时,NSDictionary只能进行一个下标操作。当我尝试进行双下标操作以访问嵌套值时,使用json["accounts"]["active"],Xcode会变得疯狂并失败。希望他们能解决这个问题。 - almel
1
@Dean 在上面的例子中(运行Xcode 6.4),要将myValue作为NSString获取,你必须对对象进行向下转换。使用以下代码可以实现: var myValue: NSString = dict["level1"]!["level2"] as! NSString 这个例子可以正常工作。 - Jack
显示剩余3条评论

5

myDictionary["accounts"] 可能是一个可选项。尝试使用: myDictionary["accounts"]?["active"]?


4

在Obj-C中,我们可以这样写:

cityName = myDictionary[@"photos"][@"region"][@"city"]

正如一些人已经发现的那样,上面的方法在Swift中并不适用,至少对我来说从未有效。

以下是如何在Swift中访问NSDictionary中三个索引值的字符串:

let cityName = ((myDictionary!["photos"] as NSDictionary)["region"]! as NSDictionary)["city"]! as String

希望在Swift的下一个更新版本中,所有这些都可以被简化成我们在Obj-C中所拥有的。


如果将其转换为 NSDictionary 并使用 valueForKeyPath,如 (jsonResponse as NSDictionary).valueForKeyPath("geometry.location.lat") as? Int,那么它会更容易。但是我也发现了另一种从字典中获取嵌套数据的方法。+1 - GoodSp33d
我遇到了同样的问题。这个问题是否已经变得更容易了?我正在寻找一种自动化的方法来完全解析和类型转换整个嵌套字典/数组混合JSON。 - David Schumann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接