JSON写入错误类型尝试通过JSON发送自定义类到.NET Web服务
问题描述:
我试图发送数据到一个.NET Web服务接受三个参数的类型是(字符串,字符串,QBUser类)。在Javascript中,我将发送参数JSON像这样:JSON写入错误类型尝试通过JSON发送自定义类到.NET Web服务
{sKey: "key", sUpdatetype: "edit", oQbUser: QBUser}
我从未有过这种方法的任何问题之前和.NET将能够把它整理成权服务器上的类对象。对于Swift,我已经成功地发送了本书中几乎所有类型的东西,但是我有问题发送自定义类/结构作为参数。这里是我当前的代码:
func updateQbUser(k: String, t: String, oUser: QBUUser, completion: @escaping (_ oVisits: AnyObject) ->()) {
let params: [String: Any] = ["sKey": k, "sUpdateType": t, "iObjectId": oUser]
let url = URL(string: "myWebService.asmx/updateQbUser")!
let session = URLSession.shared
var request = URLRequest(url: url)
request.httpMethod = "POST"
do { request.httpBody = try JSONSerialization.data(withJSONObject: params, options: .prettyPrinted) } catch let error { print(error.localizedDescription) }
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")
let task = session.dataTask(with: request as URLRequest, completionHandler: { data, response, error in
guard error == nil else { return }
DispatchQueue.main.async { completion(response!) }
})
task.resume()
}
在控制台中显示的错误如下:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid type in JSON write (QBUUser)'
的QBUUser类是没有的NSString,NSNumber的,的NSArray,NSDictionary的,或NSNull的一个实例,这样我被困在如何将这个传递给服务器。
有没有办法在尝试发送之前将QBUUser类转换为上面列出的任何对象类型?我试图在类上运行一个循环,这是一个完全不同的锤子袋,但有一些关于无法通过数组文字或任何这样的AnyHashable错误。有没有更好的方法我没有发现?
参数必须以这种方式,所以我卡在那里。我只需要将课程发送到另一端,就像本质上就是一个键/值对一样。
这里是一流的样子印在控制台:
[QBUUser]:
ID:20786
created at:2017-05-03 15:05:56 +0000
updated at:2017-05-03 20:16:52 +0000
externalUserID:2456369827
blobID:0
facebookID:(null)
twitterID:(null)
twitterDigitsID:(null)
full name:Erik Grosskurth
email:[email protected]
login:Erik_2456369827
phone:(null)
tags:(
""
)
lastRequestAt:2017-05-03 20:20:16 +0000
customData:(null)
website:(null)
答
你,最有可能的,只是需要你的QBUUser
对象转换成字典。你可以直接使用它,但如果你打算重用这个功能,你也可以做一个辅助函数来完成它。
字典应该只是看起来像这样:
let qbuUser = QBUUser() //presumably you already have a reference to the user in question
let user: [String : Any] = ["id" : qbuUser.ID, "createdAt" : qbuUser.createdAt, "updatedAt" : qbuUser.updatedAt, ...]
如果你想创建一个在您QBUUser
类的帮助方法,你可以这样做:
extension QBUUser {
func toDictionary() -> [String : Any] {
return ["id", self.ID, "createdAt", self.createdAt, ...]
}
}
这会允许你改变你现有的功能,看起来像这样:
let params: [String: Any] = ["sKey": k, "sUpdateType": t, "iObjectId": oUser.toDictionary()]
它也是o值得指出的是,参数QBUUser
对象的关键是“iObjectId”,这对我来说意味着他们需要的是来自用户的ID
,这使得整个解决方案都没有实际意义。
cool会在AM中检查这一点,谢谢 –