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
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);
}
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.
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"])
}
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
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)")
})
}