Swift:如何将带有 Alamofilre 或 SwiftyJSON 的 JSON 字符串转换为 ObjectMapper?

Posted

技术标签:

【中文标题】Swift:如何将带有 Alamofilre 或 SwiftyJSON 的 JSON 字符串转换为 ObjectMapper?【英文标题】:Swift: How to Convert JSON String with Alamofilre or SwiftyJSON to ObjectMapper? 【发布时间】:2015-06-21 10:13:13 【问题描述】:

我目前正在使用ObjectMapper for Swift 将 JSON 对象从 API 映射到模型对象

但我的 api 返回 API 看起来像这样:


       success: true,
       data: 
       [  
          "stats":  
             "numberOfYes":0,
             "numberOfNo":2,
             "progress":  
                "done":false,
                "absolute":"2/100",
                "percent":2
             
          ,
          "quickStats":null,
          "uid":5,
          "name":"Flora",
          "imageArray":[  
             "http://s3.com/impr_5329beac79400000",
             "http://s3.com/impr_5329beac79400001"
          ],
          "metaData":  
             "description":"Floral Midi Dress",
             "price":"40$"
          
       ]


在数据节点中是数组,我无法使用此代码查找映射

let json = JSON(responseObject!)

for tests in json["impressions"][0] 
  let test = Mapper<myTests>().map(tests)
  println(test?.impressionID)

我应该如何解决? 谢谢

** 已编辑 ** 我找到了类似@tristan_him 的解决方案

ObjectModel 映射结构

class Response: Mappable 
    var success: Bool?
    var data: [Data]?

    required init?(_ map: Map) 
        mapping(map)
    

    func mapping(map: Map) 
        success <- map["success"]
        data <- map["data"]
    


class Data: Mappable 
    var uid: Int?
    var name: String?
    // add other field which you want to map        

    required init?(_ map: Map) 
        mapping(map)
    

    func mapping(map: Map) 
        uid <- map["uid"]
        name <- map["name"]
    

使用 Alamofire 响应映射

let response: Response = Mapper<Response>().map(responseObject)!

for item in response.data! 
    let dataModel: Data = item
    println(dataModel.name)

【问题讨论】:

【参考方案1】:

您可以使用以下类结构映射上面的 JSON:

class Response: Mappable 
    var success: Bool?
    var data: [Data]?

    required init?(_ map: Map) 
        mapping(map)
    

    func mapping(map: Map) 
        success <- map["success"]
        data <- map["data"]
    


class Data: Mappable 
    var uid: Int?
    var name: String?
    // add other field which you want to map        

    required init?(_ map: Map) 
        mapping(map)
    

    func mapping(map: Map) 
        uid <- map["uid"]
        name <- map["name"]
    

那么你可以如下映射:

let response = Mapper<Response>().map(responseObject)
if let id = response?.data?[0].uid 
    println(id)

【讨论】:

@tristan_him,我们可以将 'Response' 和 'Data' 类放在两个不同的 Response.swift 和 Data.Swift 文件中,还是需要将它们保存在单个 .swift 文件中? @AshishPisey,它应该可以工作。这取决于您以及您希望如何构建项目。 当前版本和swift 3一样吗?抱歉,我对这个图书馆很陌生

以上是关于Swift:如何将带有 Alamofilre 或 SwiftyJSON 的 JSON 字符串转换为 ObjectMapper?的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 如何将 SwiftValidator 集成到我的项目中

带有 Swift 的步进滑块 [重复]

如何在 swift 中创建新闻提要 UI

Swift - 如何将本地存储的对象数组(文件管理器)转换为较新的对象? (带有附加属性)

如何在swift ui中使用autoid将带有字段的新文档添加到firebase集合

如何在 Swift 2.0 中使用标签将 TextField 添加到 Cell