从烦人的格式字典中提取值

时间:2016-03-13 15:52:31

标签: ios arrays swift swift2 nsdictionary

我为这个问题的标题道歉。我不知道还有什么可以称之为。

所以...当打电话给以下人时:

let testData: [NSObject : AnyObject] = getTestData() 
print(testData)

我得到了这个输出:

[data: {"TypeId":7,"DataList":null,"TypeName":"This is a test"}]

我如何能够访问键“TypeId”的值7?

编辑: 请注意,它持有{}括号,而不仅仅是[],因此,根据我的尝试,无法进行NSDictionary的转换。

亲切的问候, 安德斯

3 个答案:

答案 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?将返回nilas?对于可以nil的类型非常有用,因为它们被解析为NSNull个实例。

答案 2 :(得分:0)

考虑到您的数据......

array[n++] = o