2017-01-22 5 views
0

Ich habe ein Problem mit der Analyse von JSON. Ich habe eine Weile gesucht, wie ich das lösen kann, aber keinen Erfolg.Swift 3 Alamofire Swifty JSON Parsing-Problem

Meine json Ausgabe sieht wie folgt aus:

{ 
    "data": [{ 
     "type": "schedules", 
     "id": "1", 
     "attributes": { 
      "date": "2016-12-24" 
     }, 
     "relationships": { 
      "user": { 
       "data": { 
        "type": "users", 
        "id": "8" 
       } 
      }, 
      "statuses": { 
       "data": [{ 
        "type": "statuses", 
        "id": "2" 
       }] 
      }, 
      "events": { 
       "data": [{ 
        "type": "events", 
        "id": "7" 
       }] 
      } 
     } 
    }, { 
     "type": "schedules", 
     "id": "2", 
     "attributes": { 
      "date": "2016-12-04" 
     }, 
     "relationships": { 
      "user": { 
       "data": { 
        "type": "users", 
        "id": "8" 
       } 
      }, 
      "statuses": { 
       "data": [{ 
        "type": "statuses", 
        "id": "12" 
       }, { 
        "type": "statuses", 
        "id": "16" 
       }, { 
        "type": "statuses", 
        "id": "17" 
       }] 
      }, 
      "events": { 
       "data": [{ 
        "type": "events", 
        "id": "16" 
       }, { 
        "type": "events", 
        "id": "17" 
       }, { 
        "type": "events", 
        "id": "1" 
       }] 
      } 
     } 
    }, { 
     "type": "schedules", 
     "id": "3", 
     "attributes": { 
      "date": "2002-12-03" 
     }, 
     "relationships": { 
      "user": { 
       "data": { 
        "type": "users", 
        "id": "7" 
       } 
      }, 
      "statuses": { 
       "data": [{ 
        "type": "statuses", 
        "id": "3" 
       }, { 
        "type": "statuses", 
        "id": "11" 
       }] 
      }, 
      "events": { 
       "data": [{ 
        "type": "events", 
        "id": "4" 
       }, { 
        "type": "events", 
        "id": "19" 
       }] 
      } 
     } 
    }], 
    "included": [ 

     { 
      "type": "events", 
      "id": "6", 
      "attributes": { 
       "name": "streamline leading-edge portals", 
       "event_type": "3", 
       "start_time": "22:20:04", 
       "end_time": "20:19:22" 
      } 
     }, { 
      "type": "events", 
      "id": "11", 
      "attributes": { 
       "name": "maximize dynamic niches", 
       "event_type": "8", 
       "start_time": "15:51:06", 
       "end_time": "22:24:56" 
      } 
     }, { 
      "type": "events", 
      "id": "12", 
      "attributes": { 
       "name": "transition vertical methodologies", 
       "event_type": "1", 
       "start_time": "19:55:59", 
       "end_time": "00:27:42" 
      } 
     } 
    ] 
} 

Mein swift dies zu erreichen sieht wie folgt aus:

func getSchedules<T: JSONObject>(_ success: @escaping ([T]) -> Void) { 
     self.getAllScheduleData { (json) in 

      var items: [T] = [] 

      if let jsonArray = json.array { 
       for jsonItem in jsonArray { 
        items.append(T.fromJSONComplete(json: jsonItem) as! T) 
       } 
      } 

      success(items) 
     } 
    } 

self.getAllScheduleData macht einen API-Aufruf Alamofire mit

Das Problem hier ist, json.array ist immer leer. Wie ich es verstehe, sollte es immer so etwas wie sein: json ["items"]. Array.

Allerdings hat diese JSON keine oberste Ebene zu nennen. d. h. Gegenstände.

Meine Optionen sind jetzt entweder json ["data"] oder json ["included"] zu bekommen. Aber ich möchte, dass sie beide zu einem Objekt analysieren.

Nicht sicher, wie man dieses bessere leider erklären kann Wenn Sie mehr Info benötigen, fragen Sie einfach.

Ich verwende: Swift 3, Alamofire, SwiftyJSON

edit: Ich habe auch eine obere Schicht, um es hinzuzufügen betrachtet nach json von Anruf zu bekommen. das heißt Elemente {Daten {}, eingeschlossen {}} aber geschafft haben, es nicht zu tun rechts

wenn ich das für in der Syntax verwenden, wie von Emptyless vorgeschlagen, ich muss wohl die Signatur dieser Methode ändern, nicht wahr?

static func fromJSONComplete<T : Object>(json: JSON) -> T { 

     let s = Schedule() 

     if let id = json["data"]["id"].string { 
      s.id = id 
     } 

     if let date = json["data"]["attributes"]["date"].string { 
      s.date = date 
     } 

     if let type = json["data"]["type"].string { 
      s.type = type 
     } 

     if let includedArray = json["included"].array { 
      for userJson in includedArray { 
       if userJson["type"].string == "users" { 
        let user : User = User.fromJSON(json: userJson) 

        s.users.append(user) 
       } 
      } 

      for statusJson in includedArray { 
       if statusJson["type"].string == "statuses" { 
        let status : Status = Status.fromJSON(json: statusJson) 
        s.statuses.append(status) 
       } 
      } 

      for eventJson in includedArray { 
       if eventJson["type"].string == "events" { 
        let event : Event = Event.fromJSON(json: eventJson) 
        s.events.append(event) 
       } 
      } 
     } 

     return s as! T 
    } 

Vielen Dank im Voraus!

Chris

+0

haben Sie die for in Syntax ausprobiert? für (key, subJSON) in json {}. Dann können Sie mit json [key] über beide Schlüssel "data" und "included" iterieren. – Emptyless

+0

@Emptyless Ich habe es versucht, aber ich denke, ich verstehe nicht ganz, wie es verwendet wird. Können Sie mir ein Codebeispiel geben? – Chrizlee

Antwort

0

Das Codebeispiel wie gewünscht:

for (key,subjson) in json { 
    for i in 1 ..< json[key].count where subjson.array != nil { 
     print("found json for key: \(key): \(json[key][i])") 
    } 
} 

Es prüft das JSON-Objekt zur Verfügung gestellt und iteriert über die zur Verfügung stehenden Top-Tasten. Wenn der Schlüssel ein Array eines Objekts enthält, wird es auch darüber iterieren.

Ein Ansatz, den ich meistens verwende, ist zum Beispiel, den Schlüssel einzuschalten und das Json-Objekt als Initialisierer zu übergeben, aber es kann auch dazu verwendet werden, in Funktionen aufzuteilen.

z.B.

switch(key) { 
case "included": 
    // Do something 
case "data": 
    // Do Something 
default: 
    break 
} 
+0

Danke @Emptless! Es hat geklappt: D Ich habe Sie updated, aber es registriert sich noch nicht wegen meiner niedrigen rep lol – Chrizlee