2017-05-16 5 views
1

In unserem iOS-Projekt verwenden wir SwiftyJSON und ObjectMapper, um JSON-Antworten zu analysieren und in Modellen zu speichern. Für die Modelle müssen wir das Mapping jedoch manuell angeben. z.B; wenn ich eine Modellklasse namens Benutzer haben, die Namen und das Alter als Eigenschaften hat, dann beim Parsen, muss ich die folgenden in der User-Klasse angeben:Generalisierter JSON-Parser für Swift

func mapping(map: Map) { 
     name <- map["Name"] 
     age <- map["Age"] 
    } 

die für alle Modelle gleich zu tun, ist mühsam und zeitaufwendig . Gibt es nicht einen Ansatz, um das Parsing zu verallgemeinern? Wie ich JSON an eine Funktion übergebe und das Modell spezifiziere, und die Funktion sollte mir das Modellobjekt mit den analysierten Werten zurückgeben, wenn sie verfügbar sind. Ich möchte kein separates Mapping für jedes Modell schreiben.

+2

lol Sie wollen Verknüpfung einer Verknüpfung! –

+0

Es wird sehr hilfreich sein für Projekte, die eine große Anzahl von Modellen haben. Außerdem nehmen Bibliotheken wie Gson in Android bereits das gleiche vor. – StudentX

Antwort

1

Ich denke, Sie sollten einen Blick auf EVReflection, eine Swift 3-Bibliothek, die tut, was Sie suchen.

Update:

Swift 4 (in Beta jetzt) ​​scheint einige Änderungen zu bringen, die auf diese Frage relevant sind.

struct MyStruct: Codable { 
    var str: String 
    var num: Int 
} 

let myStruct = MyStruct(str: "test", num:5) 

let encoder = JSONEncoder() 
let jsonData = try encoder.encode(myStruct) 
let json = String(data: jsonData, encoding: .utf8) 

print(json) // prints {"str": "test", "num": 5} 

// Also decoding 

let decoder = JSONDecoder() 
let decoded = try decoder.decode(MyStruct.self, from: jsonData) 

// decoded is a structure of type MyStruct 

print(decoded.str) // test 
+0

Damit wird das Arbeiten mit Codable in Swift 4 noch einfacher: https://github.com/evermeer/Stuff#codable