2017-08-09 133 views
1

我想分析從服務器接收的JSON對象。有我的解析JSON和創建對象的代碼。在Swift中解析JSON

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 

    } 

這個工作很好,當guard語句不返回nil時。 例如,當其中一個參數爲空時,guard語句返回nil並且對象無法創建。 如何解析JSON,如果任何對象沒有從服務器接收或獲得null?

+2

不相關,但**從來沒有**在一個類中聲明屬性作爲隱式解包可選,它在'init'方法中初始化,傳遞非可選值。這些屬性也可以(甚至更好)工作,而不會有驚歎號或問號。 – vadian

+0

也可以使用if-let語句來做你想做的事情,因爲如果guard語句得到一個零值,它將返回。 – Rishabh

+0

@Rishabh謝謝你的回覆,我想找更好的方法,而不是讓我發言,但我不認爲有更好的辦法。 – ava

回答

3

我推薦使用專用的init方法。

以兩種方式聲明的屬性:

  • 如果空字符串或0可表示沒有值聲明屬性作爲非可選的,並且使用零合併運算符(如第一5個屬性)。
  • 如果沒有價值必須單獨處理財產申報標準可選(如timetype

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 
    } 
} 

它也宣佈其不打算更改屬性的好習慣它們的值爲let(如serial)的常量。初始化以相同的方式工作。

+0

謝謝,多數民衆贊成在初始化對象時,我會解析我的JSON的好方法。 – ava

+0

但是當任何項目是INT而不是字符串如何可以用戶呢? – ava

+0

我更新了異質字典的答案(指定'balance'爲'Int') – vadian

1

如果該對象的其中一個屬性爲零,則聲明該屬性爲零,並使用if let語句進行可選展開而不是guard let。這樣,不存在的屬性將被初始化爲nil,而不是整個對象被初始化爲nil。這樣你甚至不需要指定的初始化程序。

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

如果所有的屬性都是可選的,那麼所有'if - let'表達式都是多餘的,可以省略。 – vadian

+0

你是對的,更新了我的答案。 –

+0

在這段代碼中當任何項返回null時,初始化這個項後是否爲零? – ava