不解析 JSON 数据在 Swift 1.2

标签: json Swift
发布时间: 2017/3/5 6:15:47
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有我想要将它在解析 JSON 数据 Swift 1.2。 我发现这篇文章,它帮助我很多︰ http://www.learnswift.io/blog/2015/3/4/populating-a-uitableview-with-json

然而在本教程中的 JSON 文件比我稍微有点不同︰ https://api.github.com/search/repositories?q=learn+swift+language:swift & 排序 = 星星 & 顺序 = desc

(那里是"项目"数组)

这里是我: (我想要显示的所有行︰ row0,1 排......)

{                       
    "headers": {
        "NOTE_ID": "NOTE_ID",
        "NOTE_NAME": "NAME",
        "SUBJECT": "SUBJECT"
    },
    "row0": {
        "NOTE_ID": "45680",
        "NOTE_NAME": "Do not go there",
        "SUBJECT": "Manchester"
    },
    "row1": {
        "NOTE_ID": "45681",
        "NOTE_NAME": "Watch TV",
        "SUBJECT": "Football game"
    },
    "info": {
        "PageCounter": 17,
        "NoteCounter": "1670"
    }
}

我知道我需要改变这一部分,因为 JSON 在本教程中的"项目"所以它那里包装的数组︰

            if let reposArray = json["items"] as? [NSDictionary] {
                // 5
                for item in reposArray {
                    repositories.append(Repository(json: item))
                }
            }

完整的代码︰

override func viewDidLoad() {
    super.viewDidLoad()
    // 1
    let reposURL = NSURL(string: "https://www.example.com/api/notes")
    // 2
    if let JSONData = NSData(contentsOfURL: reposURL!) {
        // 3
        if let json = NSJSONSerialization.JSONObjectWithData(JSONData, options: nil, error: nil) as? NSDictionary {
            // 4
            if let reposArray = json["items"] as? [NSDictionary] {                
                // 5
                for item in reposArray {
                    repositories.append(Repository(json: item))
                }
            }
        }
    }
}

谁可以帮我吗? 在此先感谢许多了。

解决方法 1:

很难讲,因为你也有 items 条目也不是一个数组。这是一本字典,每个值在哪里,本身,另一个字典。

所以,你可以做类似︰

if let reposDictionary = json as? [String: [String: AnyObject]] { 
    // do something with `reposDictionary`, e.g.,
    //
    // for (key, value) in reposDictionary { ... }
}

或者,如果您想要使用 NSDictionary 而不是 Swift 字典︰

if let reposDictionary = json as? NSDictionary { ... }

--

顺便说一句,如果这些行的顺序很重要,你不应该使用一本字典 (即无序),和相反你应该更改 JSON,以便它真的返回一个数组︰

{
    "headers": {
        "NOTE_ID": "NOTE_ID",
        "NOTE_NAME": "NAME",
        "SUBJECT": "SUBJECT"
    },
    "items": [
        {
            "row0": {
                "NOTE_ID": "45680",
                "NOTE_NAME": "Do not go there",
                "SUBJECT": "Manchester"
            }
        },
        {
            "row1": {
                "NOTE_ID": "45681",
                "NOTE_NAME": "Watch TV",
                "SUBJECT": "Football game"
            }
        }
    ],
    "info": {
        "PageCounter": 17,
        "NoteCounter": "1670"
    }
}

或者,更好的︰

{
    "headers": {
        "NOTE_ID": "NOTE_ID",
        "NOTE_NAME": "NAME",
        "SUBJECT": "SUBJECT"
    },
    "items": [
        {
            "NOTE_ID": "45680",
            "NOTE_NAME": "Do not go there",
            "SUBJECT": "Manchester"
        },
        {
            "NOTE_ID": "45681",
            "NOTE_NAME": "Watch TV",
            "SUBJECT": "Football game"
        }
    ],
    "info": {
        "PageCounter": 17,
        "NoteCounter": "1670"
    }
}

所以有一本字典, headersinfo ,但使 items 数组。现在你可以使用下面的语法︰

if let reposArray = json["items"] as? [NSDictionary] { ... }
官方微信
官方QQ群
31647020