2017-08-09 125 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