Virtual Device
Virtual Device

Reputation: 2050

Objects inside Array inside Object Swift

Can somebody help with parsing this kind of JSON object?

{  
   "array":[  
      {  
         "title":"",
         "desc":""
      },
      {  
         "title":"",
         "desc":""
      },
      {  
         "title":"",
         "desc":""
      }
   ]
}

My code doesnt work

let task = self.session.dataTask(with: url) {
        data, response, error in
        if let data = data,
            let json = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {
            for case let announcment in json!["array"]{
                guard let title = announcment["title"] as? String,
                    let description = announcment["desc"] as? String,
                else{ return }
    }
    task.resume()

Thank in advance for any help!

Upvotes: 4

Views: 1072

Answers (2)

Leo Dabus
Leo Dabus

Reputation: 236380

You can structure your data and make it Codable:

struct Root: Codable {
    let array: [Announcement]
}
struct Announcement: Codable {
    let title: String
    let desc: String
}

let data = Data("""
{"array":[{"title":"","desc":""},{"title":"","desc":""},{"title":"","desc":""}]}
""".utf8)

do {
    let announcements = try JSONDecoder().decode(Root.self, from: data).array
    for announcement in announcements {
        print(announcement)
    }
} catch {
    print(error)
}

This will print

Announcement(title: "", desc: "")
Announcement(title: "", desc: "")
Announcement(title: "", desc: "")

Upvotes: 1

JonJ
JonJ

Reputation: 1061

Pretty-printing your JSON makes it easier to work through:

{
   "array":[
      {
         "title":"",
         "desc":""
      },
      {
         "title":"",
         "desc":""
      },
      {
         "title":"",
         "desc":""
      }
   ]
}

You need to get the array first. An array of dictionaries is of type [[String: Any]].

let task = self.session.dataTask(with: url) {
    data, response, error in
    if let data = data,
        let json = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {
            guard let announcements = json["array"] as? [[String: Any]] 
                else { return }

            announcements.forEach { announcement in
            guard let title = announcement["title"] as? String,
                let description = announcement["desc"] as? String
                else { return }
            // Do something with the result
            }
       }
  }
task.resume()

Upvotes: 3

Related Questions