2017-07-29 2 views
0

Ich versuche, ein eingebettetes JSON-Array durchzulaufen und alle Werte zu extrahieren, die in ein lokales Array eingegeben werden sollen. Dies ist, was die JSON wie folgt aussieht:Looping durch eingebettete JSON-Arrays in Swift?

"welcome": { 
    "data": { 
    "tncUrl": "" 
    }, 
    "items": [ 
    { 
     "newUser": [ 
     { 
      "stepConcept": false 
     }, 
     { 
      "stepSafety": true 
     }, 
     { 
      "stepFacilitator": true 
     }, 
     { 
      "stepTransparency": true 
     } 
     ], 
     "switcher": [ 
     { 
      "stepConcept": true 
     }, 
     { 
      "stepSafety": true 
     }, 
     { 
      "stepFacilitator": true 
     }, 
     { 
      "stepTransparency": true 
     } 
     ] 
    } 
    ] 
} 

ich in der Lage bin zu einem Punkt, wo ich mir Abrufen von Werten für „newUser“ sehen kann, wird das Problem durch diese Werte Looping und das Hinzufügen von ihnen einen Array. Ich erhalte dabei einen Fehler EXC_BAD_INSTRUCTION. Dies ist der Code Ich verwende diese Werte zu erhalten:

func prepareArrayOfViews(userType: User) 
    { 
     if (welcomeJSON != nil) 
     { 
      let items : NSArray? = welcomeJSON!.value(forKey: "items") as? NSArray 

      if (items == nil) 
      { 
       listOfViews = ["stepConcept", "stepSafety", "stepFacilitator", "stepTransparency"] 
       maxPages = listOfViews.count 
       return 
      } 

      if (items != nil) { 

       if let newUser = (items?.value(forKey: "newUser") as? NSArray){ 

        //Below is where the error "EXC_BAD_INSTRUCTION" 
        for key in (newUser as! NSDictionary).allKeys 
        { 
         if (((newUser as! NSDictionary).value(forKey: key as! String) as? Bool)!) 
         { 
          listOfViews.append(key as! String) 
         } 
        } 

       } 

       if (listOfViews.count == 0) 
       { 
        listOfViews = ["stepConcept", "stepSafety", "stepFacilitator", "stepTransparency"] 
       } 

       maxPages = listOfViews.count 
      } 
     } 
    } 
+1

Sind Sie für das Senden des JSON verantwortlich? Wenn ja, warum senden Sie mehrere Wörterbücher mit nur einem Schlüssel in einem Array (anstatt ** einem ** Wörterbuch)? – vadian

+0

Der Code war bereits vorhanden, ich schreibe ihn neu, um ihn den neuen JSON-Daten anzupassen. – SwiftyJD

Antwort

2

ich den Code geändert haben zu ändern Swift zu verwenden nativen Strukturen. Da Sie keine Fehler behandeln oder nichts tun, wenn das optionale Entpacken nicht funktioniert, habe ich auch die Entpackung geändert, um Anweisungen zu schützen.

Abgesehen von den schwerwiegenden Problemen mit Swift-Codierungsverfahren bestand Ihr Problem darin, dass Sie versuchten, ein Array von Wörterbüchern als einfaches Wörterbuch zu durchlaufen.

func prepareArrayOfViews(userType: User){ 
    guard let welcomeJSON = welcomeJSON else {return} 
    guard let items = welcomeJSON["items"] as? [[String:Any]] else { 
     listOfViews = ["stepConcept", "stepSafety", "stepFacilitator", "stepTransparency"] 
      maxPages = listOfViews.count 
      return 
    } 
    for item in items { 
     if let newUser = item["newUser"] as? [[String:Any]] { 
      for embeddedDict in newUser { 
       for (key, value) in embeddedDict { 
        if let val = value as? Bool, val == true { 
         listOfViews.append(key) 
        } 
       } 
      } 
     } else if let switcher = item["switcher"] as? [[String:Any]]{ 
      for embeddedDict in switcher { 
       for (key, value) in embeddedDict { 
        if let val = value as? Bool, val == true { 
         //do whatever you need to with the value 
        } 
       } 
      } 
     } 
    } 
    if (listOfViews.count == 0){ 
     listOfViews = ["stepConcept", "stepSafety", "stepFacilitator", "stepTransparency"] 
    } 
    maxPages = listOfViews.count 
} 
+0

Danke für Ihre Hilfe, aber der Code gibt einen Fehler auf Die Zeile: for (Schlüssel, Wert) in embeddedDict - Typ '(Schlüssel: String, Wert: Beliebig)' entspricht nicht dem Protokoll 'Sequenz' – SwiftyJD

+0

@SwiftyJD mein schlechter, versehentlich gegossener 'neuerBenutzer' in einem Dictionary anstelle eines Arrays von Wörterbüchern. Sehen Sie meinen aktualisierten Code, es sollte jetzt funktionieren. –

+1

Es sieht so aus, als ob es jetzt besser funktioniert, danke! – SwiftyJD

1

Da

//here newUser is an NSArray 

    if let newUser = (items?.value(forKey: "newUser") as? NSArray){ 

         //here newUser forced to NSDictionary 
         for key in (newUser as! NSDictionary).allKeys 

versuchen, diesen Teil zu

if let newUsers = (items?.value(forKey: "newUser") as? NSArray){ 

       for newUser in newUsers 
       { 
        for key in (newUser as! NSDictionary).allKeys 
       { 
        if (((newUser as! NSDictionary).value(forKey: key as! String) as? Bool)!) 
        { 
         listOfViews.append(key as! String) 
        } 
       } 
       } 

      } 
+0

Ich sehe, dass ich die Elemente im newUser-Array als Wörterbuch für die Schlüsselpaare erhalten muss. Fehle ich etwas? -Niemals, ich sehe, du hast deine Antwort aktualisiert. – SwiftyJD

+0

Ich bekomme einen SIGABRT-Fehler in dieser Zeile: für Schlüssel in (newUser als! NSDictionary) .allKeys – SwiftyJD

+1

@SwiftyJD siehe meine Antwort, die native Swift-Strukturen und keine unsicheren Unrappings verwendet –