首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >不能正确解析JSON数据,因为它的格式?

不能正确解析JSON数据,因为它的格式?
EN

Stack Overflow用户
提问于 2015-11-17 08:05:21
回答 2查看 141关注 0票数 0

我正试图解析如下所示的数据:

看起来每个记录都是顺序的..。0,1,2,然后在每个记录中都有许多键值对,如名称或showID。

我想进入每个记录,只得到某些对,例如名称,showID和日期。

这是我的代码,我不知道循环中的模式应该是什么?

换句话说,如何将特定字段放入我的空字典数组中?

代码语言:javascript
代码运行次数:0
运行
复制
    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
                    {

                    }
                }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-17 10:29:50

这样做的目的是创建一个包含所需属性的结构(或类),该结构由从字典中的值创建的初始化器创建。

假设您想要创建包含显示名称和显示ID的" show“对象。

您可以创建这样的结构:

代码语言:javascript
代码运行次数:0
运行
复制
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
    }
}

然后遍历字典并将每个字典传递给结构初始化器,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
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方法(如sortfilter等)轻松地筛选或排序其内容。

shows数组中的每个对象都是一个Show对象,具有带有字典数据的nameshowID属性。

flatMap所做的是通过在初始数组上迭代(如循环)来创建Show对象数组。在这条线上:

代码语言:javascript
代码运行次数:0
运行
复制
let shows = items.flatMap { Show(dictionary: $0) }

$0表示当前数组元素。这意味着对于items数组中的每个元素,我们使用它并使用它创建一个新的Show实例,并将得到的对象数组放入常量shows中。

还有经常使用的map,但是这里我们的Show结构的init是一个可选的init,所以它返回一个可选的Show,而flatMap知道如何处理这个(它将安全地打开可选的,忽略map没有的)。

票数 0
EN

Stack Overflow用户

发布于 2015-11-17 11:45:20

如果您想简化您的子解析,请尝试使用这个开放源码https://github.com/SwiftyJSON/SwiftyJSON

这样,您就可以访问项0的名称字段。

代码语言:javascript
代码运行次数:0
运行
复制
let userName = json[0]["name"].string
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33751895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档