【问题标题】:Parse JSON using swiftyjson without loop使用没有循环的 swiftyjson 解析 JSON
【发布时间】:2017-05-23 01:38:30
【问题描述】:

我正在尝试使用 SwiftyJSON 解析 JSON。我已经能够成功地完成我需要的一切,但我认为有一种更好的方法可以使用 flatmap 之类的东西使代码更简洁、更快。

现在我在 API 调用后获取 JSON 数据。我正在使用此代码解析该 JSON 数据并将其放入自定义类 Contact 的数组中。自定义类“Contact”中有一堆字符串,例如“firstName”、“lastName”和“phoneNumber”。

这是调用的样子以及用于在完成处理程序中解析 JSON 的循环。有没有更好的方法可以使用平面地图或其他东西来做到这一点?

Alamofire.request(url, method: .get).responseJSON{ response in
    switch response.result {
    case .success(let value):

        let swiftyJsonVar = JSON(response.result.value!)
        let totalResponseArray = swiftyJsonVar.arrayValue

        var allTheContacts = [Contact]()

        for contact in 0 ..< totalResponseArray.count{

            let itterateArray = totalResponseArray[contact] //singleRetailer
            let contactToAppend = Contact()

            contactToAppend.firstName = itterateArray["firstName"].stringValue
            contactToAppend.lastName = itterateArray["lastName"].stringValue
            contactToAppend.phoneNumber = itterateArray["phone"].stringValue

            allTheContacts.append(contactToAppend)
        }
    }
}

【问题讨论】:

    标签: json swift swifty-json


    【解决方案1】:

    使用这个地图功能

    var allTheContacts  = totalResponseArray.map { (obj) -> Contact in
    
     let contactToAppend = Contact()
     contactToAppend.firstName = obj["firstName"].stringValue
     contactToAppend.lastName = obj["lastName"].stringValue
     contactToAppend.phoneNumber = obj["phone"].stringValue
        return contactToAppend
    }
    

    【讨论】:

      【解决方案2】:

      您几乎无法使用地图或循环功能。没有更简单的方法来做到这一点。如果您尝试清理代码,要记住的一件事是 swift JSON 数组中的对象是 JSON 对象。所以我尝试在代码中做的一件事是将 JSON 解析抽象为它所属的类的 init 函数。

      class Contact {
          var firstName: String
          var lastName: String
          var phoneNumber: String
      
          init(json: JSON) {
              contactToAppend.firstName = obj["firstName"].stringValue
              contactToAppend.lastName = obj["lastName"].stringValue
              contactToAppend.phoneNumber = obj["phone"].stringValue
          }
      }
      

      有了这样的东西,你可以定义你的循环更简单,或者你可以使用一个简单的地图。

      var allTheContacts  = totalResponseArray.map { (obj) -> Contact in
          return contact(json: obj)
      }
      

      或者循环版本

      var allTheContacts = [Contact]()
      for contact in totalResponseArray {
          allTheContacts.append(Contact(json: contact))
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多