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