如何按字母顺序显示JSON中的数据?

如何按字母顺序显示JSON中的数据?,json,swift,xcode,parsing,Json,Swift,Xcode,Parsing,我一直在使用JSONParsing在搜索术语时显示我的数据。现在我想按字母顺序列出所有这些术语。但是我很难让代码正常工作。我从其他有同样问题的人那里复制了一些代码,并使其正常工作,但我在实现自己的代码时遇到了问题 我目前正在用以下代码解析我的JSON: func parseJSONSignDictionary() { if let url = Bundle.main.url(forResource: "csvjson", withExtension: "json") {

我一直在使用JSONParsing在搜索术语时显示我的数据。现在我想按字母顺序列出所有这些术语。但是我很难让代码正常工作。我从其他有同样问题的人那里复制了一些代码,并使其正常工作,但我在实现自己的代码时遇到了问题

我目前正在用以下代码解析我的JSON:

    func parseJSONSignDictionary() {

        if let url = Bundle.main.url(forResource: "csvjson", withExtension: "json") {
        do {
            let date = Date()
            let data = try Data(contentsOf: url)
            if let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String:Any] {

                (json["results"] as? [[String:Any]])?.forEach { j in
                    if let name = j["identifier"] as? String, let id = j["id"] as? Int {


                        let sign = Signs(name: name, number: id)
                        signsArray.append(sign)
                    }
                }

            }
            print("Took", Date().timeIntervalSince(date))
        } catch {
            print(error.localizedDescription)
        }
    }

}
编辑以添加更多代码,这是my Signs类,它将替换餐厅数组/类:

class Signs: NSObject, Decodable, NSCoding {



private var _signName: String!
private var _signNumber: Int!


var signName: String {
    return _signName
}

var signNumber: Int {
    return _signNumber
}



func encode(with aCoder: NSCoder) {
    aCoder.encode(signName, forKey: "signNameKey")
}

required init?(coder aDecoder: NSCoder) {
    print("Trying to turn Data into Sign")
    self._signName = aDecoder.decodeObject(forKey: "signNameKey") as? String
}

init(name: String, number: Int) {

    self._signName = name
    self._signNumber = number
}
}

我尝试使用的另一个StackOverflow中的代码来自这里。问题:

我还想知道这个“名字”是从哪里来的?是具有var名称的数组/模型吗

我不确定,因为如果我需要尝试使用getdata()函数,我有办法用自己的函数访问JSON数据


我只想了解我遗漏了什么,以及如何独自完成以使代码正常工作。

Related:。链接答案中的解决方案已过时。自从Swift 3(3年前发布)以来,JSON字典就不再是Swift中的
[String:Any]
了,而且
可变容器
在Swift中毫无意义。谢谢vadian。我认为我唯一需要担心的代码是来自makeDataSource函数,它似乎是章节标题信息的来源。除非我在这一点上完全错了。罗伯,不,我可以改变它。这正是我一直在使用的对我有用的东西。如果getData()JSON结构更好,那么我不介意使用我一直在使用的JSONParsing函数。或者如果有更好的方法来解析JSON,我也不介意使用它。编辑:我正在编辑原始帖子,以包含我的Signs类代码,我相信其中包含一些json解析器/解码代码。
func makeDataSource(names:[String:[AnyObject]]) {
    var dict = [String:[Restaurant]]()
    let letters = NSCharacterSet.letters
    for (_,value) in names {
        //Iterating Restaurants
        for resObj in value {
            if let restaurantName = resObj["name"] as? String {
                let restaurant = Restaurant(name: restaurantName)
                var key = String(describing: restaurant.name.first!)

                //To check whether key is alphabet or not
                key = isKeyCharacter(key: key, letters: letters) ? key : "#"

                if let keyValue = dict[key] {
                    //Already value exists for that key
                    var filtered = keyValue
                    filtered.append(restaurant)

                    //Sorting of restaurant names alphabetically
                    //filtered = filtered.sorted(by: {$0.0.name < $0.1.name})
                    dict[key] = filtered
                } else {
                    let filtered = [restaurant]
                    dict[key] = filtered
                }
            }
        }
    }
    //To sort the key header values
    self.dataArray = Array(dict).sorted(by: { $0.0 < $1.0 })

    //Logic to just shift the # category to bottom
    let temp = self.dataArray[0]
    self.dataArray.removeFirst()
    self.dataArray.append(temp)

    self.indexTitles = Array(dict.keys.sorted(by: <))
    let tempIndex = self.indexTitles[0]
    self.indexTitles.removeFirst()
    self.indexTitles.append(tempIndex)


}
            if let restaurantName = resObj["name"] as? String {