2017-02-09 8 views
0

ich ein JSON-Ergebnis von Alamofire und SwiftyJSON haben und ich versuche, ein Wörterbuch von ihm zu erstellen ein Array ErgebnisSwift 3 JSON Array Wörterbuch

JSON

JSON: [ 
    { 
    "p_589b6a49a0bfd" : { 
     "path" : "\/uploads\/588fa43eba3c9\/588fa43eba3c9_1486580297.jpg", 
     "likes" : "0", 
     "userid" : "588fa43eba3c9", 
     "caption" : "Bae", 
     "comments" : "0", 
     "date" : "1486580297" 
    } 
    }, 
    { 
    "p_589b7f1c540f1" : { 
     "path" : "\/uploads\/588fa43eba3c9\/588fa43eba3c9_1486585628.jpg", 
     "likes" : "0", 
     "userid" : "588fa43eba3c9", 
     "caption" : "Hot stuff bitch ", 
     "comments" : "0", 
     "date" : "1486585628" 
    } 
    } 
] 

Request/Response

zu erstellen
Alamofire.request(BASE_URL + "index.php/feed/build", method: .get, headers: headers).responseJSON { response in 

     switch response.result { 

     case .success(let value): 
      let json = JSON(value) 
      print("JSON: \(json)") 

     case .failure(let error): 
      print(error) 

     } 

    } 

Ich habe dann eine einfache Klasse namens "FeedPost" eingerichtet, die jedes der Elemente in JSON-Antwort (das ist die Funktion in der FeedPost-Klasse)

speichert

Ich muss irgendwie durch den JSON zyklisch durchlaufen, um ein Wörterbuch zu erstellen, das an FeedPost übergeben wird, und dann jedes FeedPost zu einem anderen Array hinzufügen, das während der Anforderung als Posts bezeichnet wird. Die mit 'p_' beginnende Zeichenfolge

Antwort

3

Mit der Alamofire-Antwort haben Sie SwiftyJSON verwendet und mit Ihrer FeedPost-Init verwenden Sie das schnelle native Wörterbuch. Ich schlage vor, dass Sie entweder mit SwiftyJSON oder mit dem nativen Typ von swift arbeiten. Da Sie bereits init mit Wörterbuch hinzugefügt haben, beantworte ich Ihre Antwort mit nativem Typ.

Alamofire.request(BASE_URL + "index.php/feed/build", method: .get, headers: headers).responseJSON { response in 

    switch response.result { 

    case .success(let value): 
     If let dic = value as? [String: Any], 
      let array = DIC["JSON"] as? [[String: Any]] { 
       for item in array { 
        for (key, value) in item { 
          If let subDic = value as? [String: Any] { 
           let obj = FeedPost(postid: key, postData: subDic) 
          } 
        } 
       } 
     } 
     print("JSON: \(json)") 

    case .failure(let error): 
     print(error) 

    } 

} 

Hinweis: Correct Wörterbuch Notation für JSON in schnellen 3 [String: Any] nicht [String: AnyObject] so Ihre Init-Parameter postdata des Typ [String: Any] ändern.

+0

Nach dem obj ich es 'var Beiträge an eine Variable anhängen = [FeedPost]()' ' self.posts.append (obj)' Aber wenn ich versuche, es zu drucken, ist es nur druckt [ FeedPost, FeedPost] – Chad

+0

@Chad Sie drucken ein Array von 'FeedPost' benutzerdefiniertem Objekt, so dass es Ihnen den Objekttyp anzeigt, es ist nichts falsch daran. Jetzt brauchen Sie nur noch TableView, um Informationen von diesem Array anzuzeigen. –

+0

perfekt, danke! – Chad

1

Unten ist der Code, der für Ihren Fall verwendet werden kann, Dieser Code wird von Spielplätzen kopiert.

import UIKit 

typealias JSONDictionary = [String: AnyObject] 

    class Post { 
     let id: String 
     let userId: String? 
     let date: Double? 
     let caption: String? 
     let comments: Double? 
     let likes: Double? 
     let path: String? 

     init?(with dictionary: JSONDictionary) { 
      guard let postId = dictionary.keys.first, let postInfo = dictionary[postId] as? JSONDictionary else { return nil } 

      self.id = postId 
      self.userId = postInfo["userid"] as? String 
      self.date = postInfo["date"] as? Double 
      self.caption = postInfo["caption"] as? String 
      self.comments = postInfo["comments"] as? Double 
      self.likes = postInfo["likes"] as? Double 
      self.path = postInfo["path"] as? String 
     } 
    } 

Parsen JSON-Array wird so sein.

case .success(let value): 
    let jsonArray = value["JSON"] as? [JSONDictionary] 
    let posts = jsonArray?.flatMap(Post.init(with:)) 
    print("Posts \(posts)" 
case .failure: break 

Ich habe dies versucht, eine lokale JSON-Datei in einem Spielplatz & Code wurde so etwas wie.

let url = Bundle.main.url(forResource: "data", withExtension: "json") 
let data = try! Data(contentsOf: url!) 

let jsonArray = try! JSONSerialization.jsonObject(with: data , options: .allowFragments) as? [JSONDictionary] 
let posts = jsonArray?.flatMap(Post.init(with:)) 
+0

Mit diesem Code, bekomme ich 'Ambiguous Verweis auf Mitglied JsonObject (mit: Optionen :) 'Lassen Sie JsonArray = versuchen! JSONSerialization.jsonObject (mit: Wert, Optionen: .allowFragments) als? [JSONDictionary] lassen Sie Beiträge = jsonArray.flatMap (Post.init (mit: JSONDictionary)) Drucken ("Posts (Posts)") ' – Chad

+0

Ich denke, Sie brauchen diesen Code nicht, erhalten Sie geparsten JSON-Objekt dh Wert. Ich erwähnte das für den Fall, wenn Sie das versuchen werden. –

+0

Ah sehe ich so jetzt mit dieser 'lassen Sie jsonArray = Wert [" JSON "] als? [JSONDictionary] lassen Sie Beiträge = jsonArray? .flatMap (Post.init (mit :)) ' Ich bekomme Typ 'any' hat keine tiefgestellten Mitglieder mit dem 'Wert' als Fehler markiert ist? – Chad