如何对来自 Alamofire 的 JSON 和 return 最终 JSON 对象进行排序(快速 JSON)
How to sort JSON coming from Alamofire and return final JSON object (swiftyJSON)
我无法简洁地从 api 中提取数据,将用户当前位置添加到对象中,然后根据计算的距离对数据进行排序。
Whosebug 问题并没有完全回答我面临的问题。看这里:How to sort posts read from JSON server file in Swift.
我目前正在从 Alamofire 加载 api 数据并使用 UITableViewController 呈现该数据。
override func viewDidLoad() {
super.viewDidLoad()
titleLabel.title = q.capitalizedString
Alamofire.request(.GET, "http://www.thesite.com/api/v1/things", parameters: ["q" : q])
.responseJSON { response in
let JSONObject = JSON(response.result.value!)
self.results = JSONObject["things"]
for (key, _) in self.results {
let intKey: Int = Int(key)!
var thisItem: JSON = self.results[intKey]
let geoLat = thisItem["place"][0]["location"]["geo"][1].double ?? 37.763299
let geoLong = thisItem["place"][0]["location"]["geo"][0].double ?? -122.419356
let destination = CLLocation(latitude: geoLat, longitude: geoLong)
let setLocation = CLLocation(latitude: self.currentLocation.latitude, longitude: self.currentLocation.longitude)
let distanceBetween: CLLocationDistance = destination.distanceFromLocation(setLocation)
thisItem["distance"].double = distanceBetween
self.results[intKey] = thisItem
}
self.tableView.reloadData()
}
}
我从api获取数据并成功添加了用户所在位置与目的地目的地之间的距离。
但是,现在我需要对 JSON 对象 (SwiftyJSON) 从最低到最高的距离进行排序。这就是我卡住的地方。
重新加载 tableView(作为 JSON 对象)时的数据结构本质上是:
results = [
{"title": "Chai", "distance": "1245.678575"},
{"title": "Espresso", "distance": "765845.678575"},
{"title": "Drip Coffee", "distance": "23445.678575"}
...
]
我怎样才能:1) 将对象转换为 NSArray 并排序;或者 2) 只是对对象进行排序?什么时候是进行距离添加和排序的最佳位置 - 我应该在转换为 JSON 对象之前进行吗?
感谢任何帮助!谢谢!
如果results
是一个SwiftyJSON对象,你可以用.arrayValue
提取它的数组。
let resultsArray = results.arrayValue
然后一旦你有了一个普通的字典数组,你就可以用 sort
对数组进行排序,如下所示:
let sortedResults = resultsArray.sort { [=11=]["distance"].doubleValue < ["distance"].doubleValue }
我拿了你的JSON片段:
并使用 Swifty 在 Playground 中测试了我的答案JSON:
如果你愿意,你也可以直接对 SwiftyJSON 对象进行排序:
let sortedResults = results.sort { [=12=].0.1["distance"].doubleValue < [=12=].1.1["distance"].doubleValue }.map { [=12=].1 }
但我发现它作为源代码的可读性较差。
Swift 3 & Swift 4
let sortedResults = finalJsonArray.sorted { [=10=]["count"].doubleValue < ["count"].doubleValue }
Swift 3 + Swift 4
我找到的最短解决方案如下:
<
是升序排序,
>
正在降序排序
它对 (String,JSON)
格式的排序特别有效(当你使用 SwiftyJSON 时)
let sortedResults = json.sorted(by: < )
我无法简洁地从 api 中提取数据,将用户当前位置添加到对象中,然后根据计算的距离对数据进行排序。
Whosebug 问题并没有完全回答我面临的问题。看这里:How to sort posts read from JSON server file in Swift.
我目前正在从 Alamofire 加载 api 数据并使用 UITableViewController 呈现该数据。
override func viewDidLoad() {
super.viewDidLoad()
titleLabel.title = q.capitalizedString
Alamofire.request(.GET, "http://www.thesite.com/api/v1/things", parameters: ["q" : q])
.responseJSON { response in
let JSONObject = JSON(response.result.value!)
self.results = JSONObject["things"]
for (key, _) in self.results {
let intKey: Int = Int(key)!
var thisItem: JSON = self.results[intKey]
let geoLat = thisItem["place"][0]["location"]["geo"][1].double ?? 37.763299
let geoLong = thisItem["place"][0]["location"]["geo"][0].double ?? -122.419356
let destination = CLLocation(latitude: geoLat, longitude: geoLong)
let setLocation = CLLocation(latitude: self.currentLocation.latitude, longitude: self.currentLocation.longitude)
let distanceBetween: CLLocationDistance = destination.distanceFromLocation(setLocation)
thisItem["distance"].double = distanceBetween
self.results[intKey] = thisItem
}
self.tableView.reloadData()
}
}
我从api获取数据并成功添加了用户所在位置与目的地目的地之间的距离。
但是,现在我需要对 JSON 对象 (SwiftyJSON) 从最低到最高的距离进行排序。这就是我卡住的地方。
重新加载 tableView(作为 JSON 对象)时的数据结构本质上是:
results = [
{"title": "Chai", "distance": "1245.678575"},
{"title": "Espresso", "distance": "765845.678575"},
{"title": "Drip Coffee", "distance": "23445.678575"}
...
]
我怎样才能:1) 将对象转换为 NSArray 并排序;或者 2) 只是对对象进行排序?什么时候是进行距离添加和排序的最佳位置 - 我应该在转换为 JSON 对象之前进行吗?
感谢任何帮助!谢谢!
如果results
是一个SwiftyJSON对象,你可以用.arrayValue
提取它的数组。
let resultsArray = results.arrayValue
然后一旦你有了一个普通的字典数组,你就可以用 sort
对数组进行排序,如下所示:
let sortedResults = resultsArray.sort { [=11=]["distance"].doubleValue < ["distance"].doubleValue }
我拿了你的JSON片段:
并使用 Swifty 在 Playground 中测试了我的答案JSON:
如果你愿意,你也可以直接对 SwiftyJSON 对象进行排序:
let sortedResults = results.sort { [=12=].0.1["distance"].doubleValue < [=12=].1.1["distance"].doubleValue }.map { [=12=].1 }
但我发现它作为源代码的可读性较差。
Swift 3 & Swift 4
let sortedResults = finalJsonArray.sorted { [=10=]["count"].doubleValue < ["count"].doubleValue }
Swift 3 + Swift 4 我找到的最短解决方案如下:
<
是升序排序,
>
正在降序排序
它对 (String,JSON)
格式的排序特别有效(当你使用 SwiftyJSON 时)
let sortedResults = json.sorted(by: < )