2017-05-23 64 views
0

我想解析使用SwiftyJSON的JSON。我已经能够成功地完成所有我需要的功能,但我认为有更好的方法可以使代码更简洁,更快速地使用像flatmap这样的东西。使用swiftyjson无循环解析JSON

现在我正在获取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) 
     } 
    } 
} 

回答

0

使用此地图功能

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

您使用的是地图或循环功能非常坚持。这并不是一个简单的方法。有一点要记住,如果你想清理你的代码,那么swift JSON数组中的对象就是JSON对象。所以我尝试在代码中做的事情之一就是将JSON解析为它所属类的初始化函数。

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