所以这是JSON
{
"city": {
"id": 4930956,
"name": "Boston",
"coord": {
"lon": -71.059769,
"lat": 42.358429
},
"country": "US",
"population": 0,
"sys": {
"population": 0
}
},
"cod": "200",
"message": 0.0424,
"cnt": 39,
"list": [
{
"dt": 1473476400,
"main": {
"temp": 76.33,
"temp_min": 73.11,
"temp_max": 76.33,
"pressure": 1026.47,
"sea_level": 1027.96,
"grnd_level": 1026.47,
"humidity": 73,
"temp_kf": 1.79
},
"weather": [
{
"id": 500,
"main": "Rain",
"description": "light rain",
"icon": "10n"
}
],
"clouds": {
"all": 8
},
"wind": {
"speed": 7.29,
"deg": 300.501
},
这是我的控制器,我去抓取数据......
class ViewController: UIViewController,UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var amConnected: UILabel!
@IBOutlet weak var weatherTable: UITableView!
var arrRes = [[String:AnyObject]]()
var swiftyJsonVar: JSON?
override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.doSomethingNotification(_:)), name: "ReachabilityChangedNotification", object: nil)
let openWMAPI = "http://api.openweathermap.org/data/2.5/forecast/city?q=Boston,Ma&APPID=XXXXXXXXXXXXXXX&units=imperial"
Alamofire.request(.GET,openWMAPI).responseJSON{
(responseData) -> Void in
print(responseData)
let swiftyJsonVar = JSON(responseData.result.value!)
self.weatherTable.reloadData()
}
.responseString{ response in
//print(response.data.value)
// print(response.result.value)
//print(response.result.error)
//eprint("inhere");
}
weatherTable.rowHeight = UITableViewAutomaticDimension
weatherTable.estimatedRowHeight = 140
// Do any additional setup after loading the view, typically from a nib.
}
在我的表循环中,它现在说jsonArray是nil并且失败了。 我不确定此时我做错了什么。
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = weatherTable.dequeueReusableCellWithIdentifier("theCell", forIndexPath: indexPath)
let label1 = cell.viewWithTag(101) as! UILabel
print("inhere")
if((swiftyJsonVar) != nil){
if let jsonArray = self.swiftyJsonVar["list"].array {
var temp = jsonArray[indexPath.row]["main"]["temp"].float
var rdate = jsonArray[indexPath.row]["dt_txt"].string
print(temp)
}else{
print("test")
}
}
label1.text = "TEST"
return cell
}
OVerall我只是不确定如何深入了解JSON的下一个级别。
答案 0 :(得分:2)
如果您不反对,请尝试使用AlamofireObjectMapper而不是SwiftyJson
1)如果你要经常更改json键的名称,并且要进行大量的枚举转换,请尝试:
2)如果名称相同,只需最少的转换,直接使用: AlamofireJsonToObjects
这两种情况都为json对象创建模型类。如果您有一个数组 - 您可以将var定义为数组 如果它是一个对象或一个对象数组 - 然后你可以创建另一个模型类,它再次是Mappable,然后在原始模型中定义这样一个对象var。
上述库将使您的代码非常干净,同时将对象提取到json。
答案 1 :(得分:1)
如果我们有以下JSON,您可以使用连续的下标访问SwiftyJSON中JSON数组内的元素:
var json: JSON = ["name": "Jack", "age": 25,
"list": ["a", "b", "c", ["what": "this"]]]
然后,您可以通过以下方式访问主数组中包含的子数组list
的四个元素,例如:
json["list"][3]["what"] // this
或者您可以定义类似此let path = ["list",3,"what"]
的路径,然后以这种方式调用它:
json[path] // this
通过上面的解释,让我们用你的JSON文件介绍它,列出数组weather
中的元素:
if let jsonArray = json["list"].array {
// get the weather array
if let weatherArray = jsonArray[0]["weather"].array {
// iterate over the elements of the weather array
for index in 0..<weatherArray.count {
// and then access to the elements inside the weather array using optional getters.
if let id = weatherArray[index]["id"].int, let main = weatherArray[index]["main"].string {
print("Id: \(id)")
print("Main: \(main)")
}
}
}
}
你应该在控制台中看到:
Id: 800
Main: Clear
我希望这对你有所帮助。