我正试图解析如下所示的数据:
看起来每个记录都是顺序的..。0,1,2,然后在每个记录中都有许多键值对,如名称或showID。
我想进入每个记录,只得到某些对,例如名称,showID和日期。
这是我的代码,我不知道循环中的模式应该是什么?
换句话说,如何将特定字段放入我的空字典数组中?
let task = NSURLSession.sharedSession().dataTaskWithURL(url) { (data, response, error) -> Void in
if let urlContent = data
{
do
{
var jsonResult:NSDictionary = try NSJSONSerialization.JSONObjectWithData(urlContent, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary
if let items = jsonResult["items"] as! NSArray?
{
var emptyArrayOfDictionary = [[String : AnyObject]]()
for item in 0...jsonResult.count
{
}
}
发布于 2015-11-17 10:29:50
这样做的目的是创建一个包含所需属性的结构(或类),该结构由从字典中的值创建的初始化器创建。
假设您想要创建包含显示名称和显示ID的" show“对象。
您可以创建这样的结构:
struct Show {
let name:String
let showID:Int
init?(dictionary: [String:AnyObject]) {
guard let name = dictionary["name"] as? String,
let showID = dictionary["showID"] as? Int else {
return nil
}
self.name = name
self.showID = showID
}
}
然后遍历字典并将每个字典传递给结构初始化器,如下所示:
let task = NSURLSession.sharedSession().dataTaskWithURL(url) { (data, response, error) -> Void in
if let urlContent = data {
do {
if let jsonResult = try NSJSONSerialization.JSONObjectWithData(urlContent, options: []) as? [String : AnyObject] {
if let items = jsonResult["items"] as? [[String : AnyObject]] {
let shows = items.flatMap { Show(dictionary: $0) }
}
}
} catch {
print(error)
}
}
}
结构初始化器是可选的,这意味着如果字典不包含键"name“或"showID”,它将不会创建对象,而是返回零;这就是为什么我们使用flatMap
来迭代而不是map
(因为flatMap会打开选项)。
现在您有了一个对象数组shows
,您可以使用Swift方法(如sort
、filter
等)轻松地筛选或排序其内容。
shows
数组中的每个对象都是一个Show
对象,具有带有字典数据的name
和showID
属性。
flatMap
所做的是通过在初始数组上迭代(如循环)来创建Show
对象数组。在这条线上:
let shows = items.flatMap { Show(dictionary: $0) }
$0
表示当前数组元素。这意味着对于items
数组中的每个元素,我们使用它并使用它创建一个新的Show
实例,并将得到的对象数组放入常量shows
中。
还有经常使用的map
,但是这里我们的Show
结构的init是一个可选的init,所以它返回一个可选的Show
,而flatMap
知道如何处理这个(它将安全地打开可选的,忽略map
没有的)。
发布于 2015-11-17 11:45:20
如果您想简化您的子解析,请尝试使用这个开放源码https://github.com/SwiftyJSON/SwiftyJSON
这样,您就可以访问项0的名称字段。
let userName = json[0]["name"].string
https://stackoverflow.com/questions/33751895
复制相似问题