2016-07-22 20 views
0

Ich bin neu in der iOS Programmierung und habe ein kleines Problem bezüglich JSON Parsing.Swift: Hilfe bezüglich JSON Parsing

"data": [ 
{ 
    "merchantId": "56", 
"timings": [ 
    [ 
     "11:00 AM", 
     "11:00 PM" 
    ] 
    ], 
"tags": [ 
    "dine,north chinese" 
    ], 
"offers": [ 
    { 
     "approvedBy": "56", 
     "locationId": "56", 
     "description": "Get 15% Off", 
     "finePrint": "• Cannot be combined with other offers.", 
     "audience": "all", 
     "status": "live", 
     "createdAt": "2016", 
     "updatedAt": "2016", 
     "offerType": "Discount", 
     "discount": "15", 
     "maxDiscount": 0, 
     "id": "56" 
    }, 
    { 
     "approvedBy": "56023", 
     "locationId": "56023", 
     "description": "Get 25% Off", 
     "finePrint": "• Cannot be combined with other offers", 
     "audience": "all", 
     "status": "live", 
     "createdAt": "2016", 
     "updatedAt": "2016", 
     "hangoutId": "", 
     "offerType": "PercentDiscount", 
     "discount": "25", 
     "amount": 0, 
     "maxDiscount": 0, 
     "id": "5623" 
    }, 
}; 

Ich möchte die oben genannten JSON-Daten herunterladen, analysieren und in einem Etikett anzeigen. Ich bin in der Lage zu laden und die Merchantid anzuzeigen, indem Sie den folgenden Code verwendet:

let JSONRespone = response.result.value as? [String:AnyObject] 
      if JSONRespone != nil { 

       let datarray = JSONRespone!["data"] as? [[String:AnyObject]] 
       if datarray != nil { 
        for data in datarray! { 

         let anObject = SomeObject() 

         let merchantId = data["merchantId"] as? String 
         if merchantId != nil { 
          anObject.merchantidentity = merchantId! 
         } 

Wenn ich den gleichen Code für die Timings verwenden und Tags, es nichts anzeigt wird. Wenn ich versuche, das Ergebnis in der Konsole anzuzeigen, wird "nil" angezeigt.

Abgesehen davon, wie könnte ich die "Beschreibung" in "Angebote" in drei verschiedenen Etiketten drucken. Ich konnte nur einen von allen drucken. Kann mir bitte jemand helfen, folgendes anzuzeigen. Danke im Voraus.

Antwort

0

beachten Sie, dass Angebote eine Reihe von Angeboten ist, jedes Element im Array ist ein Wörterbuch, so dass Sie besser cre aß ein neues Objekt „Klasse“ Angebot, mit Eigenschaften, die jede Taste in jedem Wörterbuch in Angeboten Array repräsentieren

so sollte Ihre Klasse Someobject in etwa so aussehen

class SomeObject { 

    var name: String! 
    var imageURLString: String! 
    var address: String! 
    var area: String! 
    var awardedLoyalty: Int! 
    var cashbackPercentage: Double! 
    var city: String! 
    var contactNumber: String! 
    var createdAt: String! 
    var distanceFromUser: Double! 
    var id: String! 
    var isDiscounted: Bool! 
    var isFavorite: Bool! 
    var latitude: Double! 
    var logo: String! 
    var longitude: Double! 
    var merchantId: String! 
    var offers: [Offer]! // this is an array of offers, each offer in the array is of type (Offer()), which you must create your self, check Offer.swift file, it's a class Offer 
    var tags: [String]! 
    var timings: [String]! 
    var updatedAt: String! 

} 

und SomeObject.offers eine Reihe von Angebot ist

so Ihr Angebot Objekt „Klasse“ so etwas wie

class Offer { 

    var amount: Double! 
    var approvedBy: String! 
    var audience: String! 
    var createdAt: String! 
    var description: String! 
    var discount: Double! 
    var finePrint: String! 
    var hangoutId: String! 
    var id: String! 
    var locationId: String! 
    var maxDiscount: Double! 
    var offerType: String! 
    var status: String! 
    var updatedAt: String! 
} 

auch

die Tags ein Array von Strings beachten sollte, ist jeder String einige Tags getrennt durch „“ Backend Entwickler sollten es eine Reihe von separaten Strings für jeden Tag

aber machen, hier füge ich den Code, der Ihren Parsing Teil des Codes abgeschlossen

{ 

        for data in dataArray! { 

         let anObject = SomeObject() 

         let name = data["name"] as? String 
         if name != nil { 
          anObject.name = name! 
          print("anObject.name \(name!)") 
         } 

         let heroImage = data["heroImage"] as? String 
         if heroImage != nil { 
          anObject.imageURLString = heroImage! 
          print("anObject.imageURLString \(heroImage!)") 
         } 

         let address = data["address"] as? String 
         if address != nil { 
          anObject.address = address! 
          print("anObject.address \(address!)") 
         } 

         let area = data["area"] as? String 
         if area != nil { 
          anObject.area = area! 
          print("anObject.area \(area!)") 
         } 

         let city = data["city"] as? String 
         if city != nil { 
          anObject.city = city! 
          print("anObject.city \(city!)") 
         } 

         let contactNumber = data["contactNumber"] as? String 
         if contactNumber != nil { 
          anObject.contactNumber = contactNumber! 
          print("anObject.contactNumber \(contactNumber!)") 
         } 

         let createdAt = data["createdAt"] as? String 
         if createdAt != nil { 
          anObject.createdAt = createdAt! 
          print("anObject.createdAt \(createdAt!)") 
         } 

         let distanceFromUser = data["distanceFromUser"] as? Double 
         if distanceFromUser != nil { 
          anObject.distanceFromUser = distanceFromUser! 
          print("anObject.distanceFromUser \(distanceFromUser!)") 
         } 

         let id = data["id"] as? String 
         if id != nil { 
          anObject.id = id! 
          print("anObject.id \(id!)") 
         } 

         let isDiscounted = data["isDiscounted"] as? Int 
         if isDiscounted != nil { 
          if isDiscounted! == 0 { 
           anObject.isDiscounted = false 
          } 
          else if isDiscounted == 1 { 
           anObject.isDiscounted = true 
          } 
          print("anObject.isDiscounted \(anObject.isDiscounted)") 
         } 

         let isFavorite = data["isFavorite"] as? Int 
         if isFavorite != nil { 
          if isFavorite! == 0 { 
           anObject.isFavorite = false 
          } 
          else if isFavorite == 1 { 
           anObject.isFavorite = true 
          } 
          print("anObject.isFavorite \(anObject.isFavorite)") 
         } 


         let latitude = data["latitude"] as? Double 
         if latitude != nil { 
          anObject.latitude = latitude! 
          print("anObject.latitude \(latitude!)") 
         } 

         let longitude = data["longitude"] as? Double 
         if longitude != nil { 
          anObject.longitude = longitude! 
          print("anObject.longitude \(longitude!)") 
         } 

         let merchantId = data["merchantId"] as? String 
         if merchantId != nil { 
          anObject.merchantId = merchantId! 
          print("anObject.merchantId \(merchantId!)") 
         } 

         let logo = data["logo"] as? String 
         if logo != nil { 
          anObject.logo = logo! 
          print("anObject.logo \(logo!)") 
         } 

         let awardedLoyalty = data["awardedLoyalty"] as? Int 
         if awardedLoyalty != nil { 
          anObject.awardedLoyalty = awardedLoyalty! 
          print(" anObject.awardedLoyalty \(awardedLoyalty!)") 
         } 

         let cashbackPercentage = data["cashbackPercentage"] as? Double 
         if cashbackPercentage != nil { 
          anObject.cashbackPercentage = cashbackPercentage! 
          print("anObject.cashbackPercentage \(cashbackPercentage!)") 
         } 

         let offers = data["offers"] as? [[String:AnyObject]] 
         if offers != nil { 

          var offersArray: [Offer] = [] 

          for anOffer in offers! { 
           // note that offers is an array of offers, each item in the array is a dictionary, so you better create a new object Offer, with properties that represent each key in each dictionary in offers array 
           let offer = Offer() 


           let amount = anOffer["amount"] as? Double 
           if amount != nil { 
            offer.amount = amount! 
            print("offer.amount \(amount!)") 
           } 

           let approvedBy = anOffer["approvedBy"] as? String 
           if approvedBy != nil { 
            offer.approvedBy = approvedBy! 
            print("offer.approvedBy \(approvedBy!)") 
           } 

           let audience = anOffer["audience"] as? String 
           if audience != nil { 
            offer.audience = audience! 
            print("offer.audience \(audience!)") 
           } 

           let createdAt = anOffer["createdAt"] as? String 
           if createdAt != nil { 
            offer.createdAt = createdAt! 
            print("offer.createdAt \(createdAt!)") 
           } 

           let description = anOffer["description"] as? String 
           if description != nil { 
            offer.description = description! 
            print("offer.description \(description!)") 
           } 

           let discount = anOffer["discount"] as? Double 
           if discount != nil { 
            offer.discount = discount! 
            print("offer.discount \(discount!)") 
           } 

           let finePrint = anOffer["finePrint"] as? String 
           if finePrint != nil { 
            offer.finePrint = finePrint! 
            print("offer.finePrint \(finePrint!)") 
           } 

           let hangoutId = anOffer["hangoutId"] as? String 
           if hangoutId != nil { 
            offer.hangoutId = hangoutId! 
            print("offer.hangoutId \(hangoutId!)") 
           } 

           let id = anOffer["id"] as? String 
           if id != nil { 
            offer.id = id! 
            print("offer.id \(id!)") 
           } 

           let locationId = anOffer["locationId"] as? String 
           if locationId != nil { 
            offer.locationId = locationId! 
            print("offer.locationId \(locationId!)") 
           } 

           let maxDiscount = anOffer["maxDiscount"] as? Double 
           if maxDiscount != nil { 
            offer.maxDiscount = maxDiscount! 
            print("offer.maxDiscount \(maxDiscount!)") 
           } 

           let offerType = anOffer["offerType"] as? String 
           if offerType != nil { 
            offer.offerType = offerType! 
            print("offer.offerType \(offerType!)") 
           } 

           let status = anOffer["status"] as? String 
           if status != nil { 
            offer.status = status! 
            print("offer.status \(status!)") 
           } 

           let updatedAt = anOffer["updatedAt"] as? String 
           if updatedAt != nil { 
            offer.updatedAt = updatedAt! 
            print("offer.updatedAt \(updatedAt!)") 
           } 

           offersArray.append(offer) 
          } 

          anObject.offers = offersArray 
         } 


         let tags = data["tags"] as? [String] 
         for tag in tags! { 
          //note the tags array of strings, each string is some tags separated by "," 
          //backend developer should make it an array of separate string for each tag 
          let tagsArray = tag.componentsSeparatedByString(",") 
          anObject.tags = tagsArray 
          print("tagsArray \(tagsArray)") 
         } 

         let timings = data["timings"] as? [[String]] 
         if timings != nil { 

          for timingsArray in timings! { 
           var aTimingArray: [String] = [] 

           for timing in timingsArray { 

            aTimingArray.append(timing) 
            print("timing \(timing)") 
           } 
           anObject.timings = aTimingArray 
          } 


         } 


         let updatedAt = data["updatedAt"] as? String 
         if updatedAt != nil { 
          anObject.updatedAt = updatedAt! 
          print("anObject.updatedAt \(updatedAt!)") 
         } 
0

merchantId ist ein Schlüssel für einen String-Wert, die timings und tags sind Schlüssel für Arrays, so dass Sie dann mit einem Index oder einer .firstObject/.lastObject Anruf in das Array zu erreichen haben würde:

swift let timing: String = data["timings"][0] as? String

Auch SwiftyJSON ist eine großartige Cocoapod für die Verwendung von Optionals beim Zugriff auf eine JSON-Werte

+0

Ich habe meine Fragen bearbeitet. Können Sie bitte in den Teil schauen, den ich hinzugefügt habe, d. H. "Angebote" Teil, den ich hinzugefügt habe, und mir helfen, wie ich auch damit weiterkam. Vielen Dank. –

+0

'offers' ist ein Array von Wörterbüchern. Nach der Subskription des Arrays müssen Sie das Wörterbuch mit einem Schlüssel (string) für den gewünschten Wert indizieren. 'let offerId: String = Daten [" Angebote "] [0] [" ID "] als? String' – markedwardmurray

+0

Ich habe den obigen Code hinzugefügt und versucht, die App auszuführen. Wenn ich die App starte, stürzt die App ab und ich bekomme eine Fehlermeldung, dass "Wert vom Typ '__NSCFArray' (0x1059a7d68) nicht in 'NSString' (0x106467b48) umgewandelt werden kann".Ich bekomme die gleiche Antwort, wenn ich nach "Tags" suche. –

0

Ja man kann machen Schleifen und iterieren mit if let-Anweisungen. Else Sie swiftyJson und tun Sie das in 2-3 Zeilen. Ich empfehle das, aber als Anfänger können Sie versuchen, mit Loops zu analysieren. Da im Allgemeinen, wenn Sie Daten aus einer JSON-Datei aus dem Internet analysieren. Verwenden Sie AnyObject, da Sie den Typ nicht kennen und später umwandeln.