JSON写入错误类型尝试通过JSON发送自定义类到.NET Web服务

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,这使得整个解决方案都没有实际意义。

+0

cool会在AM中检查这一点,谢谢 –