2017-08-09 7 views
1

Ich möchte ein JSON-Objekt analysieren, das vom Server empfangen wird. Es gibt meinen Code zum Analysieren von JSON und zum Erstellen von Objekten.JSON in Swift analysieren

class Transaction { 

    var id: String! 
    var amount: String! 
    var balance: String! 
    var detail: String! 
    var serial: String! 
    var time : String! 
    var type: String! 


    init(id: String, amount: String, balance: String, detail:String, serial: String, time: String, type: String) { 

    self.id = id 
    self.amount = amount 
    self.balance = balance 
    self.detail = detail 
    self.serial = serial 
    self.time = time 
    self.type = type 

    } 

func CreateTransactionObject(json: [String:Any]) -> Transaction? { 

    guard let id = json["id"] as? String, 
    let amount = json["amount"] as? String, 
    let balance = json["balance"] as? String, 
    let detail = json["detail"] as? String, 
    let serial = json["serial"] as? String, 
    let time = json["time"] as? String, 
    let type = json["type"] as? String 

    else { 

     return nil 
    } 

    let object = Transaction(id: id, amount: amount, balance: balance, detail: detail, serial: serial, time: time, type: type) 

    return object 

    } 

dies funktioniert gut, wenn Guard-Anweisung nicht zurückgeben Null. zum Beispiel, wenn einer der Parameter ist Null Guard-Anweisung zurückgeben NULL und Objekt kann nicht erstellen. Wie kann JSON parsen, wenn irgendein Objekt nicht vom Server empfangen wird oder null erhält?

+2

Nicht verwandt, aber ** niemals ** deklarieren Eigenschaften in einer Klasse als implizit unwrapped optional, die in einer 'init'-Methode mit nicht-optionalen Werten initialisiert werden. Die Eigenschaften funktionieren auch (noch besser), ohne Ausrufezeichen oder Fragezeichen. – vadian

+0

Verwenden Sie auch eine if-let-Anweisung, um das zu tun, was Sie wollen, denn wenn die Guard-Anweisung einen Nullwert erhält, wird sie zurückgegeben. – Rishabh

+0

@Rishabh danke für die Antwort, ich suche nach besseren Weg statt, wenn Aussage zu lassen, aber ich glaube nicht, dass es einen besseren Weg gibt. – ava

Antwort

3

Ich empfehle, eine dedizierte init Methode zu verwenden.

Deklarieren Sie die Eigenschaften auf zwei Arten:

  • Wenn ein leerer String oder 0 die Eigenschaft als nicht-optional und verwenden Sie die Null Koaleszierstruktur Operator (wie die ersten 5 Objekte) deklarieren keinen Wert darstellen kann.
  • Wenn kein Wert separat die Eigenschaft deklarieren behandelt werden müssen als Standard optional (wie time und type)

class Transaction { 

    var id: String 
    var amount: String 
    var balance: Int 
    var detail: String 
    let serial: String 

    var time : String? 
    var type: String? 

    init(json: [String:Any]) {  
    self.id = json["id"] as? String ?? "" 
    self.amount = json["amount"] as? String ?? "" 
    self.balance = json["balance"] as? Int ?? 0 
    self.detail = json["detail"] as? String ?? "" 
    self.serial = json["serial"] as? String ?? "" 
    self.time = json["time"] as? String 
    self.type = json["type"] as? String 
    } 
} 

Es ist auch eine gute Gewohnheit Eigenschaften zu erklären, die sich nicht ändern wollen ihr Wert als Konstanten mit let (wie serial). Die Initialisierung funktioniert auf die gleiche Weise.

+0

danke, das ist eine gute Möglichkeit, ich werde meine JSON analysieren, wenn Sie Objekt initialisieren. – ava

+0

aber wenn eines der Elemente Int ist stattdessen String wie kann Benutzer es? – ava

+0

Ich aktualisierte die Antwort für ein heterogenes Wörterbuch (Angabe von "Balance" als "Int)" – vadian

1

Wenn das Objekt immer noch verwendbar ist, wenn eine seiner Eigenschaften null ist, deklarieren Sie die Eigenschaften nil und verwenden Sie if let Anweisungen für optionales Auspacken anstelle von guard let. Auf diese Weise werden die Eigenschaften, die nicht vorhanden sind, auf nil initialisiert, anstatt dass das gesamte Objekt auf nil initialisiert wird. Auf diese Weise benötigen Sie nicht einmal einen Initialisierer.

class Transaction { 

    var id: String? 
    var amount: String? 
    var balance: String? 
    var detail: String? 
    var serial: String? 
    var time : String? 
    var type: String? 

    func CreateTransactionObject(json: [String:Any]) -> Transaction { 
     let transaction = Transaction() 

     transaction.id = json["id"] as? String 
     transaction.amount = json["amount"] as? String 
     transaction.balance = json["balance"] as? String 
     transaction.detail = json["detail"] as? String 
     transaction.serial = json["serial"] as? String 
     transaction.time = json["time"] as? String 
     transaction.type = json["type"] as? String 

     return transaction 
    } 
} 
+0

Wenn alle Eigenschaften optional sind, sind alle 'if - let' Ausdrücke überflüssig und können weggelassen werden. – vadian

+0

Sie haben Recht, meine Antwort aktualisiert. –

+0

in diesem Code, wenn eines der Elemente null zurückgibt, nach der Initialisierung dieses Elements ist null? – ava