我似乎无法访问swiftyJSON中的子数组

时间:2016-09-09 20:13:25

标签: ios json swift swifty-json

所以这是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的下一个级别。

2 个答案:

答案 0 :(得分:2)

如果您不反对,请尝试使用AlamofireObjectMapper而不是SwiftyJson

1)如果你要经常更改json键的名称,并且要进行大量的枚举转换,请尝试:

AlamofireObjectMapper

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

我希望这对你有所帮助。