【问题标题】:simple way to map a json collection response into swift object class将 json 集合响应映射到 swift 对象类的简单方法
【发布时间】:2015-07-05 06:17:06
【问题描述】:

我尝试了很多库,Alamofire、JsonHelper、ObjectMapper 等...,但不幸的是,我无法将 json 集合响应映射到对象类中。 我正在使用 swift 1.2 和 xcode 6.3 开发一个 IOS 8 应用程序,我的模型的两个类别是:

俱乐部.swift

class Club { 

    var id: String = ""
    var name: String = ""
    var imageUrl: String = ""
    var hasVip: Bool = false
    var desc: String = ""
    var location: [Location] = []

}

Location.swift

class Location {

    var country: String = ""
    var city: String = ""
    var address: String = ""
    var zip: String = ""
    var underground: [String] = []

}

我有另一个类要向我的 API 请求:

apliClient.swift

class ApiClient {

    var clubs = [Club]?()


    func getList(completionHandler: ([JSON]) -> ()) {
        let URL = NSURL(string: "https://api.com/v1/clubs")
        let mutableURLRequest = NSMutableURLRequest(URL: URL!)

        mutableURLRequest.setValue("Content-Type", forHTTPHeaderField: "application/json")
        mutableURLRequest.HTTPMethod = "GET"
        mutableURLRequest.setValue("Bearer R01.iNsG3xjv/r1LDkhkGOANPv53xqUFDkPM0en5LIDxx875fBjdUZLn1jtUlKVJqVjsNwDe1Oqu2WuzjpaYbiWWhw==", forHTTPHeaderField: "Authorization")

        let manager = Alamofire.Manager.sharedInstance
        let request = manager.request(mutableURLRequest)

        request.responseJSON { (request, response, json , error) in
            if (json != nil){
                var jsonObj = JSON(json!)
                if let data = jsonObj["hits"].arrayValue as [JSON]?{
                    completionHandler(data)
                }
            }
        }
    }
}

我认为,有一种简单的方法可以快速映射对象。我想知道,如何将completionHandler(data) 转换为[Club] 对象?

让数据 = jsonObj["hits"].arrayValue as [JSON]?

[{
  "_id" : "5470def9e0c0be27780121d7",
  "imageUrl" : "https:\/\/s3-eu-west-1.amazonaws.com\/api-static\/clubs\/5470def9e0c0be27780121d7_180.png",
  "name" : "Mondo",
  "hasVip" : false,
  "location" : {
    "city" : "Madrid"
  }
}, {
  "_id" : "540b2ff281b30f3504a1c72f",
  "imageUrl" : "https:\/\/s3-eu-west-1.amazonaws.com\/api-static\/clubs\/540b2ff281b30f3504a1c72f_180.png",
  "name" : "Teatro Kapital",
  "hasVippler" : false,
  "location" : {
    "address" : "Atocha, 125",
    "city" : "Madrid"
  }
}, {
  "_id" : "540cd44581b30f3504a1c73b",
  "imageUrl" : "https:\/\/s3-eu-west-1.amazonaws.com\/api-static\/clubs\/540cd44581b30f3504a1c73b_180.png",
  "name" : "Charada",
  "hasVippler" : false,
  "location" : {
    "address" : "La Bola, 13",
    "city" : "Madrid"
  }
}]

【问题讨论】:

  • Club 中创建一个init,它接受一个JSON 对象,然后循环遍历数组元素并从每个元素中创建一个Club 对象,将该元素附加到数组中,然后通过完成块传递该数组。
  • 为什么不使用 SwitfyJSON 和 Alamofire?

标签: json swift alamofire


【解决方案1】:

您可以使用上面提到的ObjectMapper 库来执行此操作。只需创建Club 类并确保它实现Mappable 协议。然后就可以使用 ObjectMapper 来映射数据了:

let clubs = Mapper<Club>().mapArray(JSONString)

完全披露:我是 ObjectMapper 的作者。

【讨论】:

    【解决方案2】:

    现在可以使用 Swift 2.0,简单地将您的 json 复制到 http://www.json4swift.com 并且将自动生成具有完整键值映射的 swift 模型,您需要做的就是通过传递数组或字典来实例化模型在你的 Json 之外。

    【讨论】:

    • ok,这样很好生成大json响应的模型。但是我们如何将响应映射到这些类模型。
    • 这些模型中已经存在一些便利方法,一旦您获得响应字典或字典数组,只需将其传递给这些便利模型,您就会返回映射模型
    【解决方案3】:

    对于objective-c,试试JSONModel,它可能是您正在寻找的... 和here 你可以找到更多使用它的例子

    请注意关于 swift 的这一点(来自 JSONModel 的 GitHub 页面):

    Swift 在底层的工作方式与 Objective-C 不同。因此我找不到在 Swift 中重新创建 JSONModel 的方法。 Objective-C 中的 JSONModel 通过 CocoaPods 或作为导入的 Objective-C 库在 Swift 应用程序中工作。


    更新:

    查看苹果关于在 Swift 中使用 JSON 的这篇博文 https://developer.apple.com/swift/blog/?id=37

    【讨论】:

      猜你喜欢
      • 2011-11-13
      • 2015-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-21
      • 2018-07-28
      • 2020-09-13
      • 2017-12-24
      相关资源
      最近更新 更多