从Swift对象到json(格式化[String:Any])for alamofire REST post参数(定义为[String:Any])

时间:2017-12-20 15:34:38

标签: json swift alamofire

我的目的是通过Alamofire执行REST发布请求。

我有一个对象:

struct Dog: Codable {
    var name: String
    var owner: String
}

我用这个:

let JSONString = user.toJSONString(prettyPrint: true) //ObjectMapper call 

返回:

{
    "name" : "Jon",
    "owner" : "Jon Doe"
}

但我想要一个[String: Any]结构,适合像alamofire请求:

[
    "name" : "Jon",
    "owner" : "Jon Doe"
]

怎么做?

2 个答案:

答案 0 :(得分:0)

一种解决方案是在结构中添加一个属性以返回字典表示,复杂的

var dictionaryRepresentation : [String : String] {
    return try! JSONSerialization.jsonObject(with: try! JSONEncoder().encode(self)) as! [String : String]
}

或非常简单

var dictionaryRepresentation : [String : String] {
    return ["name" : name, "owner" : owner]
}

注意:

基本上永远不会将 prettyPrinted 字符串发送到服务器。它并不关心漂亮。

答案 1 :(得分:0)

您的Dog未正确配置为使用ObjectMapper,缺少Mappable协议。

struct Dog: Mappable  {
    var name: String?
    var owner: String?

    init?(map: Map) {

    }

    // Mappable
    mutating func mapping(map: Map) {
        name    <- map["name"]
        owner   <- map["owner"]
    }
}

然后您可以使用BaseMappable.toJSON传递给Alamofire的参数,即[String: Any]

let parameters: Parameters = user.toJSON()
_ = Alamofire.request(theURL, method:.post, parameters: parameters, encoding: JSONEncoding.default).validate().responseJSON() {
    // -----...
}

PS: 我的user一定不能是Dog? :P