2017-02-02 5 views
1

Hey ich bin neu hier und ich versuche, Wert von Anfrage außerhalb der Anfrage-Funktion in VC zu erhalten, aber ich kann nicht, dass ich Fehler bekomme ich versuchte verschiedene Wege, aber ich werde immer anders Fehler, jetzt bekomme ich Typ Any hat keine Subscript-Mitglieder, können Sie mir helfen, String von Anfrage zu bekommen und ein Array zu finden und einen Wert daraus zu nehmen.Alamofire und SwiftyJSon erhalten Wert außerhalb Anfrage Funktion

Ich brauche Wert in VC von Json strin zu erhalten, also versuche ich, auf diese Weise:

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) 

Antwort: { "JSON-RPC": "2.0", "id": 1, "Ergebnis": [0, {"ubus_rpc_session": "70ea230f29057f54459814459b5a316e", "Zeitüberschreitung": 300, "läuft ab": 300, "acls": {"access-group": {"superuser": ["read", "" schreiben "]," nicht authentifiziert ": [" lesen "]}," ubus ": {" ": [" "]," sitzung ": [" access "," login "]}," uci ": { "*": ["lesen", "schreiben"]}}, "Daten": {"Benutzername": "root"}}]}

Meine Anfrage:

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

     } 

Funktion, die Anfrage-Methode aufrufen:

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

Aktualisiert: enter image description here enter image description here mit Any und nach Umwandlung SUBSCRIPT

+1

Sie nicht Wert tun [ „key“] auf Alle, Ihr Abschluss Block benötigen JSON [String: Alles] zurückzukehren, oder wandeln Sie Ihre Jeder Block alles, was Sie im Inneren Funktion benötigen –

+0

Ich habe versucht, hier Werttyp zu ändern: Vervollständigung: {(JSON: [String: Beliebige]) in loginCompletion (JSON), aber immer noch in dieser Zeile: let name = json ["usus_rpc_session"]. stringValue, ich bekomme den gleichen Fehler. –

+0

Wenn Sie [String: Any] verwenden, ist es unmöglich, immer noch Fehler über "Any" zu haben. Überprüfen Sie es erneut –

Antwort

1

Sie können nicht JSON bis [String:Any] Wenn Sie versuchen .stringValue mit Subskribierung Dictionary dann Dictionary hat keine Eigenschaft stringValue Sie mischen hier zwei Dinge SwiftyJSON und Swift nativen Typ. Ich werde auf diese Weise auf Ihre JSON Antwort zugreifen.

Zuerst klar, wie Sie den Wert ubus_rpc_session von Ihrer JSON Antwort erhalten. Sie können nicht direkt den Wert ubus_rpc_session von Ihrer JSON Antwort erhalten, weil es innerhalb des 2. Objekts in Ihrem result Array ist, so dass Sie die ubus_rpc_session versuchen, wie dieser Weg.

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

Wenn Sie mit SwiftyJSON arbeiten möchten, dann können Sie Wert von ubus_rpc_session auf diese Weise erhalten.

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

Vielen Dank, der erste Weg funktioniert, aber ich möchte das mit SwiftyJson tun, aber ich bekomme einen Fehler beim Drucken (JSON ...) Typ Any hat keine tiefgestellten Mitglieder, gibt es das Problem? –

+0

@EgleMatutyte Ich habe bereits eine Antwort für 'SwiftyJSON' hinzugefügt, ersetze den Methodencode durch meinen, ** NOTE ** Du übergibst den Namen des Vervollständigungshandlers var an' JSON' ändere ihn in 'json' und versuche es wie meine Antwort. –

+0

Ich habe schon versucht, aber immer noch Fehler, überprüfen Sie meine Frage, die ich Bild hinzugefügt. –

Verwandte Themen