serdar aylanc
serdar aylanc

Reputation: 1347

Swift ObjectMapper - array mapping

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.

Upvotes: 5

Views: 2206

Answers (2)

Prashant Tukadiya
Prashant Tukadiya

Reputation: 16416

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

Upvotes: 0

CZ54
CZ54

Reputation: 5588

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)")
}

Upvotes: 1

Related Questions