2016-05-11 6 views
1

Ich versuche, einige JSON-Daten in drei verschiedenen Arrays basierend auf der Bezeichnung in der JSON zu analysieren. Ich stehe fest und weiß nicht, warum meine for-Schleife nie betreten wird. Ich bin neu in iOS und benutze dies um schnell zu lernen. Jede Hilfe wird geschätzt. Hier ist der Code, den ich verwende:Json Parsing in iOS Spielplatz do-Methode analysiert nicht

var myPicture = [String]() 
var myPath = [String]() 
var mylabel = [String]() 


let jsonString = "[{\"picture\" : \"Picture 1 \", \"path\": \"Path 1\" , \"label\" : \"Label 1\"}]" 
//Convert jsonString to NSData 
let myData = jsonString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)! 

do{ 

let promoJson = try NSJSONSerialization.JSONObjectWithData(myData, options:.AllowFragments) 

if let promtions = promoJson[""] as? [[String: AnyObject]] { 

    for promtions in promtions { 

     if let picture = promtions["picture"] as? String 
     { 
      myPicture.append(picture) 

      if let path = promtions["path"] as? String 
      { 
       myPath.append(path) 

       if let label = promtions["label"] as? String 
       { 
        mylabel.append(label) 

       } 

      } 
     } 
    } 

} 

}catch { 
print("Error with Json: \(error)") 
} 
print(myPicture.first) 
print(myPath.first) 
print(mylabel.first) 

Die Ergebnisse für den Druck sind alle gleich Null. Es wird also nichts an die Arrays angehängt

+0

Ich weiß nicht, was die Promtions = promoJson [""] ... Linie beabsichtigt zu tun. Auch wenn es gelingt, ist "für Promtions in Promotions" trotzig falsch. – Gruntcakes

Antwort

1

Der if let promtions = promoJson[""] Teil wird nicht funktionieren und wäre sowieso nutzlos. Dies ist nur promoJson, die Sie in ein Array von Wörterbüchern umwandeln müssen.

Sie von der Lösung nicht so weit waren, an meiner Arbeitsversion des Codes aussehen:

do { 
    let promoJson = try NSJSONSerialization.JSONObjectWithData(myData, options: []) 
    if let promtions = promoJson as? [[String: AnyObject]] { 
     for promtion in promtions { 
      if let picture = promtion["picture"] as? String { 
       myPicture.append(picture) 
      } 
      if let path = promtion["path"] as? String { 
       myPath.append(path) 
      } 
      if let label = promtion["label"] as? String { 
       mylabel.append(label) 
      } 
     } 
    } 
} catch let error as NSError { 
    print(error.debugDescription) 
} 

Jetzt Alternative, dass das Problem behoben ist, lassen Sie mich vorschlagen ein anderer Weg: Verwenden Sie anstelle von separaten Arrays für Ihre Daten ein Array von Objekten, die Ihre Daten enthalten.

Zum Beispiel machen eine Struktur wie folgt aus:

struct Promotion { 
    let picture: String 
    let path: String 
    let label: String 
} 

Und ein Array für Instanzen dieser Struktur:

var myPromotions = [Promotion]() 

Jetzt können wir die JSON dekodieren, erstellen Objekte aus es sie dann speichern im Array:

do { 
    let promoJson = try NSJSONSerialization.JSONObjectWithData(myData, options: []) 
    if let promtions = promoJson as? [[String: AnyObject]] { 
     for promtion in promtions { 
      if let picture = promtion["picture"] as? String, 
        path = promtion["path"] as? String, 
        label = promtion["label"] as? String { 
       let promo = Promotion(picture: picture, path: path, label: label) 
       myPromotions.append(promo) 
      } 
     } 
    } 
} catch let error as NSError { 
    print(error.debugDescription) 
} 

nun auf den Inhalt des Feldes aussehen, sehr bequem:

for promo in myPromotions { 
    print(promo.label) 
    print(promo.path) 
    print(promo.picture) 
} 
+1

Vielen Dank gute Idee auf dem Struct Ich werde das verwenden. – MNM

1

Wenn Sie konvertieren, ist es bereits ein Array.

import Foundation 
import UIKit 

var myPicture = [String]() 
var myPath = [String]() 
var mylabel = [String]() 


let jsonString = "[{\"picture\" : \"Picture 1 \", \"path\": \"Path 1\" , \"label\" : \"Label 1\"}]" 
//Convert jsonString to NSData 
let myData = jsonString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)! 

do{ 

    let promoJson = try NSJSONSerialization.JSONObjectWithData(myData, options:.AllowFragments) as! NSArray 

     for promtions in promoJson { 

      if let picture = promtions["picture"] as? String 
      { 
       myPicture.append(picture) 

       if let path = promtions["path"] as? String 
       { 
        myPath.append(path) 

        if let label = promtions["label"] as? String 
        { 
         mylabel.append(label) 

        } 

       } 
      } 

    } 

}catch 
{ 
    print("Error with Json: \(error)") 
} 

print(myPicture.first) // "Optional("Picture 1 ")\n" 
print(myPath.first) // "Optional("Path 1")\n" 
print(mylabel.first) // "Optional("Label 1")\n" 

Das macht den Job.