BostonAreaHuman
BostonAreaHuman

Reputation: 1461

I can't seem to access sub arrays in swiftyJSON

So here is the 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
  },

Here is my Controller where I go grab the data......

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.
}

In my table loop it is now saying that the jsonArray is nil and failing. I'm unsure as to what I'm doing wrong at this point.

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 I'm just not sure how to dig down into the next level of the JSON.

Upvotes: 0

Views: 207

Answers (2)

Victor Sigler
Victor Sigler

Reputation: 23449

You can access to the elements inside an JSON array in SwiftyJSON using consecutive subscripts, if we have the following JSON for example:

var json: JSON =  ["name": "Jack", "age": 25, 
                   "list": ["a", "b", "c", ["what": "this"]]]

Then you can access to the four element of the subarray listcontained in the main array in the following way for example:

json["list"][3]["what"] // this

Or you can define a path like this let path = ["list",3,"what"] and then call it in this way:

json[path] // this

With the above explained let's introduce it with your JSON file to list the elements inside the array 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)")
           }
       }
   }
}

And you should see in the console:

Id: 800
Main: Clear

I hope this help you.

Upvotes: 1

vj9
vj9

Reputation: 1554

If you are not averse to it, try using AlamofireObjectMapper instead of SwiftyJson

1) If you are going to change the name of the json keys very often, and are going to do a lot of enum transformations try :

AlamofireObjectMapper

2) If the names are going to be the same, with minimal transformations, directly use : AlamofireJsonToObjects

Both of these cases, create model classes for your json object. If you have an array - you can define a var as an array if it is an object or an array of objects - you can then create another model class which is again Mappable and then define such an object var in the original model.

The above libraries will make your code extremely clean while extracting objects to json.

Upvotes: 2

Related Questions