Alamofire 和 SwiftyJSon 在请求函数之外获得价值

Posted

技术标签:

【中文标题】Alamofire 和 SwiftyJSon 在请求函数之外获得价值【英文标题】:Alamofire and SwiftyJSon get value outside request function 【发布时间】:2017-02-02 07:52:25 【问题描述】:

嘿,我是新来的,我正在尝试从 VC 中的请求函数之外的请求中获取价值,但我不能这样做我得到了错误我尝试了几种方法,但我不断收到不同的错误,现在我得到 Type Any 有没有下标成员,你能帮我如何从请求中获取字符串并找到一个数组并从中获取一个值。

我需要从 VC 中的 Json 字符串中获取价值,所以我正在尝试这种方式:

let retur = Json()
retur.login(userName: userName.text!, password: password.text!)  (JSON) in
    print(JSON)

    let json = JSON
    let name = json["ubus_rpc_session"].stringValue
    print(name)

回应: "jsonrpc":"2.0","id":1,"result":[0,"ubus_rpc_session":"70ea230f29057f54459814459b5a316e","timeout":300,"expires":300,"acls":"access -group":"superuser":["read","write"],"unauthenticated":["read"],"ubus":"":[""], "session":["access","login"],"uci":"*":["read","write"],"data":"username":"root" ]

我的要求:

  private func makeWebServiceCall (urlAddress: String, requestMethod: HTTPMethod, params:[String:Any], completion: @escaping (_ JSON : Any) -> ()) 


Alamofire.request(urlAddress, method: requestMethod, parameters: params, encoding: JSONEncoding.default).responseString  response in

    switch response.result 
    case .success:
        if let jsonData = response.result.value 

            completion(jsonData)
        


    case .failure( _):
        if let data = response.data 
            let json = String(data: data, encoding: String.Encoding.utf8)
            completion("Failure Response: \(json)")

        

调用请求方法的函数:

public func login(userName: String, password: String, loginCompletion: @escaping (Any) -> ()) 
let loginrequest = JsonRequests.loginRequest(userName: userName, password: password)
makeWebServiceCall(urlAddress: URL, requestMethod: .post, params: loginrequest, completion:  (JSON : Any) in
    loginCompletion(JSON)
)

更新:

【问题讨论】:

你不能在 Any 上做 value["key"],你的完成块需要返回 JSON [String: Any] 或者将你的 Any 块转换成你在函数中需要的任何东西 我尝试在此处更改值类型:completion: (JSON : [String: Any]) in loginCompletion(JSON),但仍在这一行:let name = json["ubus_rpc_session"]。 stringValue ,我得到同样的错误。 如果你使用 [String: Any] 则不可能仍然有关于“Any”的错误再次检查它 顺便说一句,如果你想要一个 json 为什么你在请求后调用 responseString ?刺痛 =\= [字符串:任意] 【参考方案1】:

您不能使用Any 下标,并且在将JSON 转换为[String:Any] 之后,如果您尝试使用.stringValue 下标Dictionary,那么Dictionary 没有任何属性stringValue 你是在这里混合两件事 SwiftyJSON 和 Swift 本机类型。我将通过这种方式访问​​您的JSON 回复。

首先弄清楚你是如何从你的JSON 回复中获得ubus_rpc_session 的价值的。您不能直接从您的 JSON 响应中获取 ubus_rpc_session 的值,因为它位于您的 result 数组中的第二个对象内,因此要获取 ubus_rpc_session 尝试这样的方式。

retur.login(userName: userName.text!, password: password.text!)  (json) in
     print(json) 
     if let dic = json as? [String:Any], let result = dic["result"] as? [Any], 
        let subDic = result.last as? [String:Any],
        let session = subDic["ubus_rpc_session"] as? String 

           print(session)         
     


如果您想使用SwiftyJSON,那么您可以通过这种方式获得ubus_rpc_session 的值。

retur.login(userName: userName.text!, password: password.text!)  (json) in
     print(json) 

     let jsonDic = JSON(json) 
     print(jsonDic["result"][1]["ubus_rpc_session"].stringValue)

【讨论】:

非常感谢,第一种方法是可行的,但我想用 SwiftyJson 来做,但我在 print(json...) 上出现错误 Type Any has no subscript members,有问题? @EgleMatutyte 我已经添加了SwiftyJSON 的答案,用我的方法代码替换您的方法代码,注意您将完成处理程序变量名称传递给JSON 更改它到json 试试我的回答。 我已经试过了,但还是报错,请检查我添加图片的问题。 @EgleMatutyte 欢迎朋友 :)

以上是关于Alamofire 和 SwiftyJSon 在请求函数之外获得价值的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中将 Alamofire 结果解析为对象(使用:Alamofire、SwiftyJSON 和 ObjectMapper)

SwiftyJson 和 Alamofire 使用的解码结构

如何将 RxSwift 与 AlamoFire 和 SwiftyJSON 一起使用?

如何使用 Alamofire 和 SwiftyJSON 正确解析 JSON

使用 Alamofire 和 SwiftyJSON 时对 JSON 进行排序

无法使用“((Any))”类型的参数列表调用“JSON” - 使用 AlamoFire 和 SwiftyJSON