2017-02-02 2 views
1

Привет, я новичок здесь, и я пытаюсь получить значение из запроса вне функции запроса в VC, но я не могу сделать это, я получаю ошибки, которые я пробовал несколькими способами, но я продолжаю получать разные ошибки, теперь я получаю Type Any, не имеет элементов подстроки, не могли бы вы помочь мне получить строку из запроса и найти массив и взять значение из него.Alamofire и SwiftyJSon получают значение вне функции запроса

Мне нужно получить значение из Json Strin в VC, так что я пытаюсь таким образом:

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", "идентификатор": 1, "результат": [0, { "ubus_rpc_session": "70ea230f29057f54459814459b5a316e", "тайм-аут": 300, "истекает": 300, "ACLs": { "группа доступа": { "суперпользователь": [ "читать",» 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) 
}) 

Обновлено: enter image description here enter image description here

+1

вы не можете сделать значение [ «ключ»] на любом, ваше завершение блок нужно вернуть JSON [String: Любой] или конвертировать Любой блок на что вам нужно внутри функции –

+0

Я попытался изменить тип значения здесь: завершение: {(JSON: [String: Any]) в loginCompletion (JSON), но все же в этой строке: let name = json ["ubus_rpc_session"]. stringValue, я получаю ту же ошибку. –

+0

если вы используете [String: Any], у вас еще может быть ошибка в вопросе «Any». –

ответ

1

Вы не можете индексировать с Any и после преобразования JSON до [String:Any], если вы пытаетесь .stringValue с подпиской Dictionary, то Dictionary не имеет собственности stringValue Вы смешиваете здесь две вещи SwiftyJSON и родной тип Swift. Я отвечу на ваш ответ JSON таким образом.

Сначала выясните, как вы получаете значение ubus_rpc_session от вашего ответа JSON. Вы не можете напрямую получить значение ubus_rpc_session от вашего ответа JSON, потому что он находится внутри 2-го объекта в вашем массиве 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) 
} 
+0

Большое вам спасибо, первый способ работает, но я хочу сделать это с помощью SwiftyJson, но я получаю ошибку при печати (json ...) Тип Any не имеет элементов подстроки, есть проблема? –

+0

@EgleMatutyte Я уже добавил ответ для 'SwiftyJSON', замените свой код метода на мой, ** ПРИМЕЧАНИЕ ** Вы передаете имя обработчика завершения обработчика в' JSON', измените его на 'json' и попробуйте, как мой ответ. –

+0

Я уже пробовал, но все равно получаю ошибку, проверьте мой вопрос, я добавил pic. –

 Смежные вопросы

  • Нет связанных вопросов^_^