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

时间:2017-02-02 07:52:26

标签: json swift xcode swifty-json

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

我需要从VC中获得Json strin的价值所以我这样做:

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, “结果”:[0,{ “ubus_rpc_session”: “70ea230f29057f54459814459b5a316e”, “超时”:300, “过期”:300, “访问控制列表”:{“访问-group “:{” 超级用户 “:[” 读”, “写”], “未认证的”:[ “读”]} “UBUS”:{ “”:[ “”], “会话”:[ “访问”, “登录”]} “UCI”:{ “*”:[ “读”, “写”]}}, “数据”:{ “用户名”: “根”}} ]}

我的要求:

  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)
})

更新 enter image description here enter image description here

1 个答案:

答案 0 :(得分:1)

如果您尝试使用Any JSON进行[String:Any],则.stringValue转换为Dictionary后,您无法下标Dictionary 1}}没有任何属性stringValue你在这里混合了两个东西SwiftyJSON和Swift原生类型。我将以这种方式访问​​您的JSON回复。

首先要清楚了解如何从ubus_rpc_session回复中获得JSON的价值。您无法直接从ubus_rpc_session响应中获得JSON的值,因为它位于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)
}