我为这个问题的标题道歉。我不知道还有什么可以称之为。
所以...当打电话给以下人时:
let testData: [NSObject : AnyObject] = getTestData()
print(testData)
我得到了这个输出:
[data: {"TypeId":7,"DataList":null,"TypeName":"This is a test"}]
我如何能够访问键“TypeId”的值7?
编辑: 请注意,它持有{}括号,而不仅仅是[],因此,根据我的尝试,无法进行NSDictionary的转换。
亲切的问候, 安德斯
答案 0 :(得分:0)
你可以使用Any类型为字典值实现类似plist的嵌套结构,Swift与Objective-C的id类型有些相似,但也可以保存值类型。
var response = Dictionary()
回复[“用户”] = [“登录”:“电力游侠”,“密码”:“强大的莫芬”“]
回复[“状态”] = 200
任何似乎都比AnyObject更好,因为在上面的代码中,响应[“status”]的类型为Swift.Int,而使用AnyObject的值类型则为__NSCFNumber。
答案 1 :(得分:0)
大多数人这样做的方法是将恼人的JSON数据解析为自定义对象。这应该在您获得JSON后立即完成。理想情况下,不应在通信代码之外使用JSON数据,例如:
首先,让我们定义一个用于保存服务器数据的类:
class MyServerObject {
let typeId: Int
let typeName: String
let dataList: [AnyObject]?
init(dictionary: Dictionary<String, AnyObject>) {
let dataDictionary = dictionary["data"] as! Dictionary<String, AnyObject>
self.typeId = dataDictionary["TypeId"] as! Int
self.typeName = dataDictionary["TypeName"] as! String
self.dataList = dataDictionary["DataList"] as? [AnyObject]
}
}
请注意,init
方法已经在解析JSON。这不必在init
中完成,您也可以创建一个返回新实例的静态parse
方法。
用法:
// demo data
let jsonString = "{\"data\": {\"TypeId\":7,\"DataList\":null,\"TypeName\":\"This is a test\"}}"
let jsonData = jsonString.dataUsingEncoding(NSUTF8StringEncoding)!
let json = try! NSJSONSerialization.JSONObjectWithData(jsonData, options: [])
// parsing
let myServerObject = MyServerObject(dictionary: json as! Dictionary<String, AnyObject>)
// now we can simply read data as properties
print(myServerObject.typeId)
print(myServerObject.typeName)
这个解决方案的一个好处是我们可以检查JSON格式,并使用正确的类型解析所有属性。
解析可以是分层的,例如,如果您的dataList
包含复杂对象,我们称之为DataListItem
,您的解析方法可以分别解析每个项目并将它们放入[DataListItem]
,例如
if let dataListJSON = dataDictionary["DataList"] as? [Dictionary<String, AnyObject>] {
self.dataList = dataListJSON.map({ DataListItem($0) })
}
另请注意,解析as!
时,如果格式无效,则会导致应用崩溃。如果类型不匹配,as?
将返回nil
。 as?
对于可以nil
的类型非常有用,因为它们被解析为NSNull
个实例。
答案 2 :(得分:0)
考虑到您的数据......
array[n++] = o