2017-03-07 5 views
0

Ich bin ziemlich neu zu swift und ich versuche, JSON Daten von einem Server in 3 Spalten angezeigt, aber ich möchte den Text in einer Zeile und möglicherweise entfernen Sie die Klammern jedes Bit Text umgeben. Ich habe unten ein Bild mit meinem Code angehängt.JSON Daten schön in Swift 3

Swift Screenshot

let u = UserDefaults.standard.value(forKey: "userIP")! 
     var request = URLRequest(url: URL(string: "http://\(u):3000/logs")!) 
     request.httpMethod = "POST" 
     let postString = "LockID=\(lockid)" 
     request.httpBody = postString.data(using: .utf8) 
     let task = URLSession.shared.dataTask(with: request) { data, response, error in 
      guard let data = data, error == nil else {             // check for fundamental networking error 
       print("error=\(error)") 
       return 
      } 

      if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {   // check for http errors 
       print("statusCode should be 200, but is \(httpStatus.statusCode)") 
       print("response = \(response)") 
       DispatchQueue.main.async() { 
       self.displayMyAlertMessage("response = \(response)") 
       } 
      } 

      let responseString = String(data: data, encoding: .utf8) 
     // print("responseString = \(responseString)") 

      if let data = responseString?.data(using: String.Encoding.utf8) { 
       let resString = JSON(data: data) 

       if resString["success"].stringValue == "true" 
       { 
        // save the data to be manipulated and stored in table somehow 
        let returned_name = resString["message"].arrayValue.map({$0["name"].stringValue}) 
        let returned_time = resString["message"].arrayValue.map({$0["lockTime"].stringValue}) 
        let returned_type = resString["message"].arrayValue.map({$0["type"].stringValue}) 

        DispatchQueue.main.async() { 
         self.updatename!.text = "\(returned_name.description)" 
         self.updateLock!.text = " \(returned_type.description)" 
         self.updateText!.text = " \(returned_time.description)" 

       } 

       } 
       else if resString["success"].stringValue == "false" 
       { 
        DispatchQueue.main.async() { 
        self.displayMyAlertMessage(resString["message"].stringValue) 
        } 
       } 

maniplulating Im JSON-Daten mit SwiftyJSON. Irgendwelche Ideen, wie ich die [|

Prost

Antwort

0

returned_name und die anderen Variablen returned... eine Array von Zeichenketten durch die map Funktion verursacht. Beim Drucken eines Arrays mit der Methode description wird "[item1, item2, item3]" angezeigt. Um jeden String separat zu drucken, benötigen Sie eine Wiederholungsschleife.

let returnedArray = resString["message"].arrayValue // you might cast the object to `[[String:Any]]` 
    for item in returnedArray { 
     print(item["name"]) 
     print(item["lockTime"]) 
     print(item["type"]) 
    } 

Um die Werte in einer Tabellenansicht angezeigt werden Sie ein Modell benötigen, ist der beste Weg, eine eigene Struktur

struct Item { 
    let name : String 
    let lockTime : String 
    let type : String 
} 

Dann

var items : [Item]() 

eine Datenquelle Array erstellen und Karte Ihre empfing JSON zum Modell

let returnedArray = resString["message"].arrayValue 
    for item in returnedArray { 
     let name = item["name"] ?? "" 
     let lockTime = item["lockTime"] ?? "" 
     let type = item["type"] ?? "" 
     items.append(Item(name:name, lockTime:lockTime, type:type)) 
    } 

Setzen Sie den Code, um die JSON in viewDidLoad zu analysieren und reloadData() am Ende nennen, in cellForRow das Element aus dem Array für die Reihe bekommen und die Werte zum Beispiel angezeigt werden:

let item = items[indexPath.row] 
self.updatename!.text = item.name 
self.updateLock!.text = item.lockTime 
self.updateText!.text = item.type 

PS: da Sie Swift neu Verwenden Sie keine Schlangenfall-Variablennamen (returned_name), verwenden Sie camel case (returnedName).

+0

Danke für Ihre Hilfe! Nur aus Neugier, gibt es einen Grund, Kamelfall über Schlangenfall zu verwenden? – CS456

+0

Es ist die Namenskonvention in Objective-C und Swift – vadian