Swift ObjectMapper - array mapping

Viewed 1862

I have a JSON response like:

      {
        total_count: 155,
        size: 75,
        authors: [{ name: "test1"
                    id: 1

                 },
                 {name: "test2"
                    id: 2
                 }]
      }

I created my object model and use objectMapper for mapping/parsing this json.

import Foundation
import SwiftyJSON
import ObjectMapper

class Author: Mappable {
    var id: Int!
    var name: String!

    required init?(map: Map) {

    }

    func mapping(map: Map) {
        self.id <- map["id"]
        self.name <- map["name"]
    }

    static func fromJSONArray(_ json: JSON) -> [Author] {
        var authorArray: [Author] = []
        if json.count > 0 {
            for item in json["authors"]{
                print(item)
                authorArray.append(Mapper<Author>().map(JSONObject: item)!)
            }
        }
        return authorArray
    }

With print(item) I can see the objects but, I can't make append work. It is giving "Unexpectedly found nil while unwrapping an Optional value" error.

2 Answers

Your JSON is not valid.

You can check your JSON validity using JSONLint for exemple.

For more safety in your code, avoid usage of !.

Replace

authorArray.append(Mapper<Author>().map(JSONObject: item)!)

by

if let author = (Mapper<Author>().map(JSONObject: item) {
    authorArray.append(author) 
} else {
    print("Unable to create Object from \(item)")
}

You have invalid JSON ,
As per your json authors is dictionary but author dictionary there is no key

As well as inside array there is dictionary but no brackets and comma

Your correct JSON is

authors: [ 
       {
        name: "",
        id: 0
       }

     ]

And then your code looks ok to me

   if json.count > 0 {
        for item in json["authors"]{
            print(item)
            authorArray.append(Mapper<Author>().map(JSONObject: item)!)
        }
    }

EDIT

Try this out

      if json.count > 0 {
            for item in json["authors"]{
                print(item)
                 do {
                   let objectData = try JSONSerialization.data(withJSONObject: item, options: .prettyPrinted)
                  let string = String(data: objectData, encoding: .utf8)
                authorArray.append(Mapper<Author>().map(JSONObject: string)!)

                  } catch {
                     print(error)
                   }
            }
        }
Related