Pass a JsonObject to Model SWIFT - json

I am trying to pass a JSON object from the list of returned results to a Model class of User. I want to do all of the assignments / parsing inside of the user object.
I keep getting the message - cannot invoke User with argument of type JSON
Any hints?
let post = JSON(data)
println("The post is: " + post.description)
var user : User
user(post[0])
println(user.getName())
import SwiftyJSON
class User {
var ObjectId = ""
var FirstName = ""
var LastName = ""
var Organization = ""
var CallSign = ""
init(sObjectId : String, sFirstName : String, sLastName : String, sOrganization : String, sCallSign : String)
{
ObjectId = sObjectId
FirstName = sFirstName
LastName = sLastName
Organization = sOrganization
CallSign = sCallSign
}
init(sUser : JSON) {
self.ObjectId = sUser["_id"].string!
self.FirstName = sUser["firstName"].string!
self.LastName = sUser["lastName"].string!
self.Organization = sUser["organization"].string!
}

you have to call the appropriate initializer directly
let post = JSON(data)
println("The post is: " + post.description)
var user = User(sUser: post[0])

Related

Create collection of JSONObjects from list of Kotlin objects

I have a room database from which I can get a List<LearningEvent>, which I then have to convert into a Collection<JSONObject> and return it. How can I efficiently do that?
Here's the LearningEvent class:
#Entity(tableName = "learningEvents")
data class LearningEvent(
#ColumnInfo(name = "learningeventid")
#PrimaryKey(autoGenerate = true)
var id: Int? = null,
var sessionId: Long,
var time: Float,
var eventType: String,
var description: String,
var feedback: String
)
Here's the DAO:
#Query("SELECT * FROM learningEvents WHERE sessionId = :sessionId")
suspend fun getAllLearningEvents(sessionId: Long?): List<LearningEvent>
And here's my non-working/non-building code for the getEvents() function:
override suspend fun getEvents(): Collection<JSONObject> =
withContext(Dispatchers.IO) {
Log.d("\ngetEvents(eventType)", currentSessionId.toString())
if (currentSessionId === null) {
throw Exception("Current session Id is null; Session cannot be retrieved.")
}
var gson = Gson();
// Return JSON object collection of table rows.
var learningEvents = db.learningEventDao().getAllLearningEvents(currentSessionId);
var returnCollection = emptyList<JSONObject>();
learningEvents.forEach{element ->
var singleObject = gson.toJsonTree(element);
returnCollection += singleObject;
}
return#withContext returnCollection;
}
In my humble opinion, you can convert LearningEvent to JSONObject using .toJson. Here the sample code:
var learningEvents = db.learningEventDao().getAllLearningEvents(currentSessionId);
var returnCollection = emptyList<JSONObject>();
learningEvents.forEach{ element ->
val singleObject = gson.toJson(element);
returnCollection += JSONObject(singleObject);
}

Alamofire decoding by index of array

I have problem with decoding of json , I can't use 'self' function on the struct , because I get json from the server by 1 key (which name "my_profile") and many values , which I return by index , and I want to decode it to the struct , pls help me
Alamofire.request(mainUrl, method:.post , parameters: paramstring , encoding: JSONEncoding.default, headers: nil).responseJSON {
response in
if let data = response.data
{
switch response.result
{
case.failure(let error):
print(error)
case.success(let value):
let json=JSON(value)
guard let dataarr = json["my_profile"].array else { return }
// I wan't send it to the structure , and get it from another view controllers
var name = dataarr[0]
var last_name = dataarr[1]
var email = dataarr[2]
}
}
}
This is my Structure
struct UserInfo : Decodable {
var name : String
var last_name : String
var emai : String
}
Json structure:
It would be better to write an initialiser for your struct:
struct UserInfo : Decodable {
var name : String
var last_name : String
var email : String
init(name: String, lastName: String, email: String) {
self.name = name
self.last_name = lastName
self.email = email
}
}
Then you can use something like this (Adapt it to your specific needs):
let json = JSON(value)
guard let dataarr = json["my_profile"].arrayValue else { return }
let stringArray = dataarr.map { $0.stringValue }
var name = stringArray[0]
var last_name = stringArray[1]
var email = stringArray[2]
let userInfo = UserInfo(name: name, lastName: last_name, email: email)
// use `userInfo` object
To pass the object to a new view controller you should define a variable in the NewViewController to store the userInfo object:
let userInfo: UserInfo!
Then from the code above you should call these lines at the end (it uses storyboard):
// ...
let userInfo = UserInfo(name: name, lastName: last_name, email: email)
let controller = storyboard?.instantiateViewController(withIdentifier: "NewViewController") as! NewViewController
controller.userInfo = userInfo
present(controller, animated: true, completion: nil)
Where NewViewController is the new controller when you'll show the userInfo object content. Don't forget to set the new view controller identifier to NewViewController in the storyboard.

Save json response and parse it into swift object

Hey I am programming a swift app and I consume a rest service for my data.
I consume it like this:
static func findAll() {
let URL = baseURL + "api/person"
Alamofire.request(URL).responseJSON {
response in
print(response.result.value ?? "")
}
}
This is the json that is returned:
{
Email = "meineEmail#gmail.com";
Geburtsdatum = "0001-01-01T00:00:00";
Nachname = Gnadlinger;
Password = "<null>";
PersonId = 0;
Telefonnummer = 9832742;
Username = SonnyBlackzz;
Vorname = Johannes;
}
Is there a way to save these json values and parse them into an object?
Best regards!
Just create an object eg:
struct Person {
var username: String
var email: String
init(username: String, email: String) {
self.username = username
self.email = email
}
}
And when you get your data just do this:
Alamofire.request(URL).responseJSON {
response in
let json = response.result.value
guard let json != nil else {
return
}
let newPerson = Person(username: json["username"], email: json["email"])
}

Parsing JSON Swift 3

I am running iOS 9.0, Swift 3 on Xcode8 and implementing Facebook into my app, the result object returns successfully as:
Optional({
email = "usersEmail#yahoo.com";
"first_name" = name;
id = 1015396591;
"last_name" = lastName;
picture = {
data = {
"is_silhouette" = 0;
url = "https://scontent.xx.fbcdn.net/v/t1.0-1/s200x200/1915003_414206574090_5019436_n.jpg?oh=bf120460b36b26c648185d6777a&oe=5892EB78";
};
};
})
However, attempting to access the elements as: result["email"] as! String, notes the error Type Any? has no Subscript Members
How can I allow the element to be read?
Use this to get email
let result = result as! Dictionary<String,Any>
let email = result["email"] as! String

Getting index of an object in returns nil

I'm trying to get the index of an object (user), in a one to many relationship. It returns nil.
import Foundation
class Groups : NSObject{
var groupName: String?
var UsersInGroup = [BackendlessUser]()
var ownerId: String?
var objectId : String?
}
func getIndex() {
self.backendless.userService.getPersistentUser()
let user = self.backendless.userService.currentUser
var dataStore = backendless.data.of(Groups.ofClass())
dataStore.findID(
"B52F6BEA-79F8-A58B-FF15-AF840BCB2A00",
response: { (result: AnyObject!) -> Void in
var LookingForGroupJoining = result as! Groups
// LookingForGroupJoining.UsersInGroup.append(user)
let index = LookingForGroupJoining.UsersInGroup.indexOf(user)
print("This is the index number : \(index)")
print("This is the user : \(user)")
print("These are all the values of the UsersInGroup : \(LookingForGroupJoining.UsersInGroup)")
dataStore.save(
LookingForGroupJoining,
response: { (result: AnyObject!) -> Void in
let GroupJoining = result as! Groups
print("Group has been saved: \(GroupJoining.groupName)")
},
error: { (fault: Fault!) -> Void in
print("Server reported an error (1): \(fault)")
})
print("Group has been found: \(LookingForGroupJoining.objectId)")
},
error: { (fault: Fault!) -> Void in
print("Server reported an error (2): \(fault)")
})
}
Here is the console output
This is the index number : nil
This is the user : <BackendlessUser> {
"__meta" = "{\"relationRemovalIds\":{},\"selectedProperties\":[\"__updated__meta\",\"password\",\"created\",\"name\",\"___class\",\"ownerId\",\"updated\",\"objectId\",\"email\"],\"relatedObjects\":{}}";
created = "2016-03-07 06:06:40 +0000";
email = "test#test.com";
lastLogin = "2016-03-11 04:30:01 +0000";
name = "<null>";
objectId = "4A955ADD-7991-1AF8-FFEF-3754587B2300";
ownerId = "<null>";
updated = "<null>";
"user-token" = "18C87E0E-2BB3-DB1D-FF63-3CD5FE003200";
}
These are all the values of the UsersInGroup : [<BackendlessUser> {
"___class" = Users;
created = "2016-03-07 03:45:05 +0000";
email = "lekan.adeyeri#gmail.com";
name = test;
objectId = "0EB97FF9-FBF1-2E7E-FF30-160BB6CFFC00";
ownerId = "<null>";
password = "<null>";
updated = "2016-03-18 22:33:02 +0000";
}, <BackendlessUser> {
"___class" = Users;
created = "2016-03-07 06:06:40 +0000";
email = "test#test.com";
name = "<null>";
objectId = "4A955ADD-7991-1AF8-FFEF-3754587B2300";
ownerId = "<null>";
password = "<null>";
updated = "2016-03-18 22:33:02 +0000";
}, <BackendlessUser> {
"___class" = Users;
created = "2016-03-06 04:15:27 +0000";
email = "tesbhjbj#ttt.tyy";
name = "<null>";
objectId = "570CD92B-74EB-1325-FF8F-B866CB6CB400";
ownerId = "<null>";
password = "<null>";
updated = "2016-03-18 22:33:02 +0000";
}, <BackendlessUser> {
"___class" = Users;
created = "2016-03-05 04:50:14 +0000";
email = "test#testmail.test";
name = test;
objectId = "A0831585-716E-B027-FF37-539497748400";
ownerId = "<null>";
password = "<null>";
updated = "2016-03-18 22:33:02 +0000";
}, <BackendlessUser> {
"___class" = Users;
created = "2016-03-05 14:54:53 +0000";
email = "test1#testmail.test";
name = test;
objectId = "C8A47476-E5D2-B84D-FF5A-2EB605040400";
ownerId = "<null>";
password = "<null>";
updated = "2016-03-18 22:33:02 +0000";
}]
I'm trying to get the index of an object (user), in a one to many relationship. It returns nil.
Found a workaround
func leavingGroup() {
self.backendless.userService.getPersistentUser()
let user = self.backendless.userService.currentUser
var dataStore = backendless.data.of(Groups.ofClass())
dataStore.findID(
"B52F6BEA-79F8-A58B-FF15-AF840BCB2A00",
response: { (result: AnyObject!) -> Void in
var LookingForGroupJoining = result as! Groups
var groupList = LookingForGroupJoining.UsersInGroup.description
// “Cleaned” groupList of unnecessary data and created groupListCleaned
var groupListCleaned: String = groupList.stringByReplacingOccurrencesOfString("\"", withString: "").stringByReplacingOccurrencesOfString("<BackendlessUser> {", withString: "").stringByReplacingOccurrencesOfString(" ", withString: "").stringByReplacingOccurrencesOfString("___class=Users;", withString: "").stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()).stringByReplacingOccurrencesOfString("},", withString: "").stringByReplacingOccurrencesOfString("]", withString: "").stringByReplacingOccurrencesOfString("}", withString: "").stringByReplacingOccurrencesOfString("[", withString: "").stringByReplacingOccurrencesOfString("created=", withString: "").stringByReplacingOccurrencesOfString("email=", withString: "").stringByReplacingOccurrencesOfString("name=", withString: "").stringByReplacingOccurrencesOfString("objectId=", withString: "").stringByReplacingOccurrencesOfString("ownerId=", withString: "").stringByReplacingOccurrencesOfString("password=", withString: "").stringByReplacingOccurrencesOfString("updated=", withString:"").stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())
// Converting groupListClean from a string to an array called arrayofUsers, where the arrays values are anything between whitespace, so the string cookie = “chocolate cake hottea” would be an array [“chocolate”, “cake”, “hottea"]
let arrayofUsers: Array = groupListCleaned.componentsSeparatedByCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
// Converting arrayofUsers into string, and replacing some characters. I did the filter here instead of groupList because it produced different results, and I preferred these results here.
var groupListClean2: String = arrayofUsers.joinWithSeparator("").stringByReplacingOccurrencesOfString(";", withString: ",")
// Once I’ve cleaned the string completely, I’m turning it into an array again called arrayofUsers2. I’m separating everything with a coma.
var arrayofUsersData: Array = groupListClean2.componentsSeparatedByString(",")
// I’m getting the index number of the current user's objectId in the data. It pulls out the index of one property belonging to one user, in a list of properties belonging to many users.
var indexnumber = arrayofUsersData.indexOf(user.objectId)
var indexnumber2 = indexnumber
var index = 0
// Since objectIds are always in the same location (7 sway from the next), if its less than really 6 (I set 3 to be safe), then its the users index is 0. If its not, then I’ll keep subtracting by 7, and incrementing the index value each time I subtract. Each user can be identified by jumping 7 indexes, this shows me how many times I have to do that jump, the amount of times is where the user is.
if indexnumber2 <= 3 {
index = 0
} else {
repeat {
indexnumber2 = indexnumber2! - 7
index = index + 1
} while indexnumber2 > 3
}
LookingForGroupJoining.UsersInGroup.removeAtIndex(index)
dataStore.save(
LookingForGroupJoining,
response: { (result: AnyObject!) -> Void in
let GroupJoining = result as! Groups
print("Group has been saved: \(GroupJoining.groupName)")
},
error: { (fault: Fault!) -> Void in
print("Server reported an error (1): \(fault)")
})
print("Group has been found: \(LookingForGroupJoining.objectId)")
},
error: { (fault: Fault!) -> Void in
print("Server reported an error (2): \(fault)")
})
}