如何将 json 数据从 alamofire 转换为 swift 对象

Posted

技术标签:

【中文标题】如何将 json 数据从 alamofire 转换为 swift 对象【英文标题】:How to convert json data from alamofire to swift objects 【发布时间】:2015-06-15 06:39:48 【问题描述】:

您好,我正在使用 swift 1.1 在 swift 中制作照片查看器应用程序 xcode 6.2

我在尝试将 json 响应从 alamofire 到 swift objects。我使用了 swiftyjson 库,但似乎 存在兼容性问题。这是我的模型类

import Foundation

struct Photo 

    var name: String
    var filename :String
    var notes: String

这是我的视图控制器

    import UIKit

    class ImageViewerTableViewController: UITableViewController 
    var photos = [Photo]()

        override func viewDidLoad() 
            super.viewDidLoad()

Alamofire.request(.GET, "http://httpbin.org/get")
         .responseJSON  (_, _, JSON, _) in

         

      

在这种情况下如何将 json 映射到 swift 对象

谢谢。

【问题讨论】:

在 Alamofire 中以 JSON 形式返回什么?如果它是一个类,请查看其源代码并尝试找出一种将每个值手动放入字典中的方法。 【参考方案1】:

最好的解决方案是使用AlamofireObjectMapper

您的代码应如下所示:

import Foundation
import ObjectMapper

struct Photo: Mappable 
    var name: String
    var filename :String
    var notes: String

    required init?(map: Map) 

    func mapping(map: Map) 
        self.name     <- map["name"]
        self.filename <- map["filename"]
        self. notes   <- map["notes"]
    

在视图控制器中:

import UIKit

class ImageViewerTableViewController: UITableViewController 
    var photos = [Photo]()

    override func viewDidLoad() 
        super.viewDidLoad()

        Alamofire
            .request(.GET, "http://httpbin.org/get")
            .responseArray  (response: Response<[Photo], NSError>) in
            if let myPhotos = response.result.value 
                print(myPhotos)
            
        
    

查看AlamofireObjectMapperObjectMapper 的文档了解更多信息。

【讨论】:

【参考方案2】:

您可以使用dataUsingEncoding 方法,并从json 对象中获取您的name,filenamenotes 变量,对于解析json 对象,我推荐SwiftyJSON

Alamofire.request(.GET, "http://httpbin.org/get", parameters: nil, encoding: .URL).responseString(completionHandler: 
        (request: NSURLRequest, response: NSHTTPURLResponse?, responseBody: String?, error: NSError?) -> Void in

        // Convert the response to NSData to handle with SwiftyJSON
        if let data = (responseBody as NSString).dataUsingEncoding(NSUTF8StringEncoding) 
            let json = JSON(data: data)
            println(json)
        
)

【讨论】:

【参考方案3】:

您可以为此使用EVReflection。您可以使用如下代码:

var photo:Photo = Photo(json:jsonString)

var jsonString:String = photo.toJsonString()

您只需将基础对象设置为 EVObject。

有关更详细的示例代码(包括数组),请参阅 GitHub 页面。

【讨论】:

我现在也有一个 Alamofire 扩展。见github.com/evermeer/AlamofireJsonToObjects【参考方案4】:

如果你不想写映射函数,我建议你看看HandyJSON。代码示例:

结构动物:HandyJSON 变量名称:字符串? 变量 id:字符串? 变量编号:整数? 让 jsonString = "\"name\":\"cat\",\"id\":\"12345\",\"num\":180" 如果让动物 = JSONDeserializer.deserializeFrom(json: jsonString) 打印(动物)

正如它所说:

HandyJSON最显着的特点是它不需要对象继承自NSObject(不是使用KVC而是反射),也没有实现'mapping'函数(使用指针来实现属性赋值)。

【讨论】:

以上是关于如何将 json 数据从 alamofire 转换为 swift 对象的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Alamofire 4.4.0 将 JSON 字符串转换为转义的 JSON 字符串(Swift 3)?

如何将 Alamofire 生成的数据从 tableview 推送到 webview

Swift3 JSON 使用 Alamofire

Alamofire 无法将 NSCFString 类型转换为字典

如何从 alamofire 中的 json 数组中获取对象?

将 alamofire json 响应转换为变量