3

How can make model class for this json data

{
    total: 41,
    totalPages: 4,
    valueData: [
    {
    id: "23",
    lastLogin: "0-Jul-2011 11:27:36 AM",
    name: "varii"
    },
    {
    id: "24",
    lastLogin: "0-Jul-2015 11:27:36 AM",
    name: "sarii"
    },
    {
    id: "25",
    lastLogin: "0-Jul-2018 11:27:36 AM",
    name: "narii"
    } ]

}


class OnResponse {

    var total: Int?
    var totalPages: Int?

    init(response: [String: Any]) {
        self.total = response["total"]
        self.totalPages = response["totalPages"]
    }
}

It's not working how can make it ready for work and how to pass values to controller to model and how to get value from model

5
  • That isn't valid JSON. The keys should all be in double quotes. Commented Jul 13, 2017 at 9:18
  • yes not valid json tried with this json4swift.com/?invalid=1 Commented Jul 13, 2017 at 9:18
  • As always, do not use Foundation NSArray / NSDictionary in Swift. Use native types. The init method cannot work. There is no key data. Commented Jul 13, 2017 at 9:21
  • are you using SwiftyJSON? or not Commented Jul 13, 2017 at 10:01
  • not consider valid json or not its just an example of data format Commented Jul 13, 2017 at 10:02

6 Answers 6

1

Follow the below class structure

class Response {
    var total: Int?
    var totalPages: Int?
    var valueData: [LoginData]?

    init(response: [String: Any]) {
       self.total = response["total"]
       self.totalPages = response["totalPages"]
       var items:[LoginData] = ()
       for (data in response["valueData"]) {
           let login = LoginData(name: data["name"], lastLogin: data["lastLogin"])
           items.append(login)
       }
       self.valueData = items
    }
}

class LoginData {
    var name: String?
    var lastLogin: String?

    init(name: String, lastLogin: String) {
        self.name = name
        self.lastLogin = lastLogin
    }
}
Sign up to request clarification or add additional context in comments.

Comments

0

you should use "reverseMatches" to retrieve the array, not the "data". May be you can use a third library to convert your json data to a model, such as Unbox, https://github.com/JohnSundell/Unbox.

Comments

0

Model for Your response :

struct ModelName {

    var total: Int?
    var totalPage: Int?
    var reverseMatches: [LoginDetails]?
}

struct LoginDetails {

    var id: String?
    var lastLogin: String?
    var name: String?
}

Parse the api response and assign the values on the appropriate fields. I have made, all the variables are optional.

Assign values like below.

var obj = Model()
obj.total = response["total"] as? Int

obj should be var, because you are going to mutate the struct values. because struct is value based, not reference based

3 Comments

class is not use to handling this one and how to assign value to the fields
you can go with struct. Class also possible
Assign values like this. var obj = Model() obj.total = 1
0
class DataModel{
    var total : Int?
    var totalPages : Int?
    var valueData : [UserModel]?

    init(JSON: [String:Any?]){
        self = parser.doParse(JSON: JSON)
    }
}

class UserModel{
    var id : String?
    var lastLogin : String?
    var name : String?
}

class parser : NSObject{
    class func doParse(JSON: [String:Any?])->DataModel{
        let dataModel = DataModel()
        dataModel.total = JSON["total"] as? Int
        dataModel.totalPages = JSON["totalPages"] as? Int
        var userInfo : [UserModel] = []
        let valueData : [String:String?]? = JSON["valueData"] as? [String:String?]
        if let valueData = valueData{
            for dataDict : [String:String?] in valueData{
                let itemModel = UserModel()
                itemModel.id = dataDict["id"] as? String
                itemModel.lastLogin = dataDict["lastLogin"] as? String
                itemModel.name = dataDict["name"] as? String
                userInfo.append(itemModel)
            }
            dataModel.valueData = userInfo
        }
        return dataModel
    }
}

Comments

0
class LoginData: NSObject {
let total: Int = 0
let totalPages: Int = 0
let valueData: Array<ValueData> = Array<ValueData>()
override init(total: Int!, totalPages: Int, valueData: Array<ValueData>!) {
self.total = total
self.totalPages = totalPages
self.valueData = valueData
}
}

struct ValueData {
let id: int?
let lastLogin: String?
let name: String?
init(id: int!, lastLogin: string, name: string!)
self.id = id ?? 0
self.lastLogin = lastLogin ?? ""
self.name = name ?? ""
}
}

Comments

0

you should use struct instead of class for creating model object...

advantages of struct over class refer Why Choose Struct Over Class? class/24232845 use two struct for holding your data one is for your single total count and other is for last login detail

struct lastLogin  {

let totalCount: (total: Int, totalPages: Int)
let valueArray: [lastLoginDetail]

}


struct lastLoginDetail {

let valueData: (id: String, lastLogin: String,name: String)

}

extension lastLoginDetail {

init(json: [String : String]) throws {
    let id = json["id"]
    let lastLogin = json["lastLogin"]
    let name = json["name"]
    let value = (id,lastLogin,name)
    self.valueData = value as! (id: String, lastLogin: String, name: String)
}

}

extension lastLogin {

init(json: [String : Any]) throws {
     let total = (json["total"] as! NSNumber).intValue
     let totalPages = (json["totalPages"] as! NSNumber).intValue
     let totalCounts = (total,totalPages)
     var userInfo : [lastLoginDetail] = []
    // Extract and validate valueData
    let valueData = json["valueData"] as? NSArray
    if let valueData = valueData{
      for dataDict   in valueData{
        let dic : [String : String] = dataDict as! [String : String]
        let  lastLoginDeatails = try! lastLoginDetail(json: dic)
        userInfo.append(lastLoginDeatails)
    }
    }
    self.valueArray = userInfo
    self.totalCount = totalCounts
}

}



func HowToUseModelClass(){

let jsonDic  = NSDictionary()
// jsonDic // your json value
let  dataValue = try! lastLogin(json: (jsonDic as! [String : Any])) // parsing the data
print(dataValue.totalCount.total)
print(dataValue.totalCount.totalPages)
print(dataValue.valueArray[0].valueData.id)

 }

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.