How to create the model class for the following JSON data and parse it?

37,379

Solution 1

After going through your JSON response, what I see is that you are getting an object which has two nodes(or properties). First- "addon_items" which has as array and for which you have created a class AddOnItems which is correct. Second- "addon": this key over here is reference to a 'Dictionary' rather than to an array.

So to store the response in your AddOnResponse object, try the following code.

Alamofire.request(.GET, myAddOnUrl).validate().reponseJSON { response in
    switch resonse.result {
    case .Success:
       if let value = response.result.value {
           let json = JSON(value)
           let responseDictionary = json.dictionaryValue as? [String: AnyObject]
           let addOnRes = AddOnResponse(addon:responseDictionary["addon"].dictionaryValue, addonitems:responseDictionary["addon_items"].arrayValue)
       }
    case .Failure:
       break
    } 
}

Also make change to your AddOnResponse class

class AddOnResponse {
    var addon: [String: AnyObject]?
    var addonitems: Array<AnyObject>?

    init(addon:[String: AnyObject]?,addonitems: Array<AnyObject>?){
        self.addon = addon
        self.addonitems = addonitems
    }
}

TL;DR Your JSON response doesn't properly correspond to the model you've made in your app. Double check the "addon" key of your json response which has a dictionary object to it and NOT AN ARRAY and accordingly make your model classes.

Edit: Rectifying the mistake to point the casting error. What I would now suggest is that pass the JSON object for `add_on' key. In the AddOn class change the initialiser so that it takes a JSON object. Then initialising them using. AddOn Class Initialiser

init(json: JSON) {
    id = json["id"].intValue
    name = json["name"].stringValue
    // and so on
}

Similarly do the same for AddOnItems. And in the AddOnResponse initialiser iterate in a loop the JSON object for AddOnItems. Initialise it and append to the addOnItems array property. Sorry cannot write the code for it right now. Got a time constraint.

Solution 2

import Foundation
import SwiftyJSON

class UserInfo {

    var mobile : Int?
    var userid : Int?
    var email : String?
    var name : String?

    init() {

    }

    init(json : JSON){
        mobile = json["phone_number"].intValue
        userid = json["id"].intValue
        email = json["email"].stringValue
        name = json["name"].stringValue
    }

}

Solution 3

Try this. I have done this using AlamofireObjectMapper. Check AlamofireObjectMapper for more info

import UIKit
import ObjectMapper


class FollowList: Mappable {

    var addonItems : [addonItemsList]?
    required init?(_ map: Map) {
        super.init(map)
    }
    override func mapping(map: Map) {
        super.mapping(map)

        addonItems <- map["addon_items"]
    }
    }
     class addonItemsList : Mappable{
    var aname : String?
    var id : String?
    var name : String?
    var order : Int?
    var aname : Int?

    required init?(_ map: Map) {

    }
    func mapping(map: Map) {

        aname <- map["aname"]
        id <- map["id"]
        order <- map["order"]
        name <- map["name"]
        icon <- map["icon"]

    }

}

       let URL = "https://raw.githubusercontent.com/tristanhimmelman/AlamofireObjectMapper/2ee8f34d21e8febfdefb2b3a403f18a43818d70a/sample_keypath_json"


          Alamofire.request(.GET, URL)..responseArray { (response: Response<[FollowList], NSError>) in { (response: Response< FollowList, NSError>) in
    expectation.fulfill()

    let FollowList = response.result.value
    print(FollowList?. addonItems)

}

Solution 4

After so many experiments I got the answer. I have to pass the data to objects like this way. i followed @nishantdesai answers and do some modifications..

 Alamofire.request(.GET, myAddOnUrl)
        .validate()
        .responseJSON
        {   response in
            switch response.result
            {
            case .Success:
                if let value = response.result.value{
                    let json = JSON(value)

                    let addOnRes = AddOnResponse(addon: json["addon"].object as? [String : AnyObject],
                                                addonitems: json["addon_items"].arrayObject)
                    print(addOnRes.addon)
                    print(addOnRes.addonitems)



                }
Share:
37,379
PRADIP KUMAR
Author by

PRADIP KUMAR

Accept the challenge in an innovative way and completed.Always ready to work for challenging projects and dedicated team.

Updated on November 09, 2020

Comments

  • PRADIP KUMAR
    PRADIP KUMAR over 3 years

    My JSON data

    {
     "addon_items" : [
                         {
                          "aname" : "",
                          "id" : "2588",
                          "name" : "Plain Nan",
                          "order" : "1",
                          "aid" : "259",
                          "Sub_Add_Items" : "",
                          "icon" : "",
                          "status" : "1",
                          "next" : "0",
                          "price" : "0.60"
                         },
                         {
                          "aname" : "",
                          "id" : "2589",
                          "name" : "Pitta Bread",
                          "order" : "2",
                          "aid" : "259",
                          "Sub_Add_Items" : "",
                          "icon" : "",
                          "status" : "1",
                          "next" : "0",
                          "price" : "0.00"
                        }
    
                       ],
    
     "addon" : {
                 "description" : "Please choose your Nan bread",
                 "aname" : "",
                 "id" : "259",
                 "icon" : "",
                 "limit" : "1",
                 "special_addon" : "",
                 "next" : "165"
               }
     }
    

    I created three class models named AddOnResponse, AddOn, AddOnItems like this:

    AddOnResponse class model

    class AddOnResponse {
    
    var addon: Array<String>?
    var addonitems: Array<AnyObject>?
    
    init(addon:Array<String>?,addonitems: Array<AnyObject>?){
        self.addon = addon
        self.addonitems = addonitems
     }
    }
    

    AddOn class model

    class AddOn {
    
    
    var id: Int?
    var icon: String?
    var desc: String?
    var limit: Int?
    var next: Int?
    var aname: String?
    var specialaddon: Int?
    
    init(id: Int?,icon: String?,desc: String?,limit: Int?,next: Int?,aname: String?,specialaddon: Int?){
    
        self.id = id
        self.icon = icon
        self.desc = desc
        self.limit = limit
        self.next = next
        self.aname = aname
        self.specialaddon = specialaddon
    
      }
     }
    

    AddOnItems class model

    class AddOnItems {
    
    
    var id: Int?
    var aid: Int?
    var name: String?
    var price: Int?
    var order: Int?
    var status: Int?
    var next: Int?
    var aname: String?
    var subaddItems: Int?
    var icon: String?
    
    init(id: Int?,aid: Int?,name: String?,price: Int?,order: Int?,status: Int?,next: Int?,aname: String?,subaddItems: Int?,icon: String?){
        self.id = id
        self.aid = aid
        self.name = name
        self.price = price
        self.order = order
        self.status = status
        self.next = next
        self.aname = aname
        self.subaddItems = subaddItems
        self.icon = icon
       }
     }
    

    Now I am fetching my JSON data using Alamofire but when accepting dat into class model using object I am getting nil value.

        var addonResponses = [AddOnResponse]()
    
        Alamofire.request(.GET, myAddOnUrl)
            .validate()
            .responseJSON
            {   response in
                switch response.result
                {
                case .Success:
                    if let value = response.result.value{
                        let json = JSON(value)
                        print(json)
                        print(json["addon"].arrayValue)
    
    
               for(_,content) in json{
                   let addOnRes = AddOnResponse(addon:content["addon"].arrayValue,
                                   addonitems:content["addon_items"].Arrayobject)
    
                            print(self.addonResponses.count)
                            print(addOnRes.addon)
                            print(addOnRes.addonitems)
                        }
                    }
    

    The addon and addonitems data are coming nil, why?