2017-08-27 2 views
2

Ich versuche, ein schnelles Objekt in JSON zu konvertieren, habe ich diese SO Fragen 1 & 2 gesehen, aber ich konnte es nicht auf meinen Code anwenden .Konvertieren Swift-Objekt (mit verschachtelten Objekten) zu JSON-Daten in einem reinen Swift 3-Wege

Ich habe ein schnelles Objekt vom Typ [String : DailyTimes], das ich es gerne in JSON-Daten in einer reinen Swift 3-Weise, ohne Bibliotheken konvertieren würde.

Unten ist meine benutzerdefinierte Klasse:

[ 
    "Monday": [ "weekday" : "Monday", 
       "available" : true, 
       "times": [ 
        ["startTime": "9:00 AM", "endTime": "1:30 PM" ], 
        ["startTime": "2:30 PM", "endTime": "6:00 PM" ], 
        ["startTime": "7:30 PM", "endTime": "9:00 PM" ] 
       ] 
    ], 
    "Tuesday": [ "weekday" : "Tuesday", 
       "available" : true, 
       "times": [ 
        ["startTime": "9:00 AM", "endTime": "6:00 PM" ] 
       ] 
       ] 
    ] 

Mein erfolgloser Versuch zu konvertieren [String : DailyTimes] zu JSON-Daten:

class AvailabilityTimes:{ 

    struct Times{ 
     var startTime : String? 
     var endTime : String? 


    } 

    struct DailyTimes{ 
     let weekday : String 
     var available : Bool 
     var times = [Times]() 
     mutating func update(times: [Times]){ 
      self.times = times 
     } 

    } 
} 

Die konvertierten JSON-Daten (von Swift-Objekt) in etwa so aussehen würde

Schritt 1: ConvertToDictionary-Funktion in beiden Strukturen hinzugefügt.

Dies ist, wo ich erfolglos versuche, in JSON-Daten zu konvertieren.

Schritt 2: Funktion, die

func convertTimesObjectToJSON(timesObject: [String : DailyTimes]){ 

       for (key, value) in timesObject{ 

        let dictionary = value.convertToDictionary 

        print("dictionary", dictionary) 
        do{ 
         let theJSONData = try JSONSerialization.data(withJSONObject: dictionary, options: .prettyPrinted) 
        } catch let error{ 
         print("error: \(error)") 
        } 



       } 

      } 
+0

Änderung dieser Zeile 'lassen Wörterbuch = value.convertToDictionary()' –

Antwort

3

Diese Methode zu JSON-Daten konvertiert:

JSONSerialization.data(withJSONObject: dictionary, options: .prettyPrinted) 

erfordert, dass dictionary eine "Eigenschaftenliste" zu sein. Und a dies:

 [ 
      "weekday" : self.weekday, 
      "available" : self.available, 
      "times"  : self.times 
     ] 

Ist keine Eigenschaftenliste.

Warum? Weil self.times vom Typ [Times] ist, was kein Eigenschaftslistentyp ist. Sie müssen self.times.map{$0.convertToDictionary()) hier anrufen, um times in eine Eigenschaftsliste umzuwandeln.

func convertToDictionary() -> Dictionary<String, Any> { 
    return [ 
     "weekday" : self.weekday, 
     "available" : self.available, 
     "times"  : self.times.map{$0.convertToDictionary()) 
    ] 
} 
2

Try this:

struct DailyTimes{ 
    let weekday : String 
    var available : Bool 
    var times = [Times]() 
    mutating func update(times: [Times]){ 
     self.times = times 
    } 

    func convertTimesToDictionary() -> [Any] { 
     var timeDict:[Any] = [] 
     self.times.forEach({ timeDict.append($0.convertToDictionary())}) 
     return timeDict 
    } 

    func convertToDictionary() -> Dictionary<String, Any> { 
     return [ 
      "weekday" : self.weekday, 
      "available" : self.available, 
      "times"  : self.convertTimesToDictionary() 
     ] 
    } 
} 

Funktion zu json konvertieren:

func convertToJSONObject(timesObject: [String : DailyTimes]) -> [String:AnyObject] { 
    var dailyTimesObject:[String:AnyObject] = [:] 
    for (key, value) in timesObject { 
     dailyTimesObject.updateValue(value.convertToDictionary() as AnyObject, forKey: key) 
    } 
    return dailyTimesObject 
} 

func convertTimesObjectToJSON(timesObject: [String : DailyTimes]){ 
    do{ 
     let theJSONData = try JSONSerialization.data(withJSONObject: convertToJSONObject(timesObject: timesObject), options: .prettyPrinted) 
     print(String(data: theJSONData, encoding: String.Encoding.utf8)!) 
    } catch let error{ 
     print("error: \(error)") 
    } 
} 
Verwandte Themen