看起来每个记录都是顺序的.. 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
{
}
}
答案 0 :(得分:0)
这个想法是创建一个结构(或类),其中包含您需要的属性,使用词典中的值通过初始化程序创建。
让我们说你想制作" Show"包含节目名称和节目ID的对象。
您可以创建一个这样的结构:
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
}
}
然后迭代你的词典并将每个词典传递给struct初始化程序,如下所示:
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)
}
}
}
struct initializer是一个可选的,意思是如果字典不包含键" name"或" showID"它不会创建对象,而是返回nil;这就是为什么我们使用flatMap
代替map
进行迭代的原因(因为flatMap展开了Optionals)。
现在您有一组对象shows
,您可以使用sort
,filter
等Swift方法轻松过滤或排序其内容。
shows
数组中的每个对象都是Show
个对象,并且包含词典数据的name
和showID
属性。
flatMap
做的是通过在初始数组上迭代(如循环)来创建Show
个对象的数组。在这一行:
let shows = items.flatMap { Show(dictionary: $0) }
$0
表示当前数组元素。这意味着对于items
数组中的每个元素,我们接受它并使用它创建一个新的Show
实例,并将生成的对象数组放在常量shows
中。 / p>
还经常使用map
,但这里我们的Show
结构的init是一个可选的init,所以它返回一个Optional Show,flatMap
知道如何解决这个问题(它会安全地展开可选项并忽略其中的那些)map
没有。
答案 1 :(得分:0)
如果您想简化您的儿子解析,请尝试使用此开源https://github.com/SwiftyJSON/SwiftyJSON
使用此功能可以访问第0项
的名称字段let userName = json[0]["name"].string