Ios如何使用Alamofire发布多个Custom对象

时间:2018-04-25 08:14:49

标签: ios json swift alamofire

您好我是iOS新手,我正在使用Alamofire进行网络通话。事情进展顺利,我在打网络时没有遇到任何麻烦。但由于我必须发布我的自定义对象,我没有运气。所以这是我以前做过的事情

let parameters: Parameters = [
        "Phone": phone,
        "ApiKey":"x-y-z"
    ]

这工作正常。

但现在我必须发布像

这样的对象
let parameters: Parameters = [
        "ApiKey": Common.API_KEY,
        "cardModel": cardModel,
        "clientModel" : clientModel
    ]

我的cardModel和客户端模型已经在Json字符串中转换了我只是将它们放入字典中。转换后的模型看起来像这些

"cardModel": {
    "ExpiryYear": 2018,
    "ExpiryMonth": 1,
    "CardNumber": "55555",
    "CardHolderName": "xyz"
}

所以我将这些序列化模型放在字典中,并使用Alamofire将这些数据发布到请求体中。

但在服务器端,这些模型为空。知道如何以我想要的方式放置自定义模型吗?请帮忙

PS 我只打印出我的参数字典,并检查了此输出

    ["ApiKey": "x-y-z",
     "\cardModel\": "{
     "\ExpiryYear\": 2018,
     "\ExpiryMonth\": 1,
     "\CardNumber\": "\55555\",
     "\CardHolderName\": "\xyz\"
    }
]

我把json打印输出的参数放在jsonLint中,格式错误。我刚删除了“\”并用{}替换了[]然后它似乎是有效的Json

那么我现在应该做什么????请帮忙

UPDATE1: 这是我的终端的有效json(从android发送)

{
"ApiKey": "XXX-XXX-XXX",
"cardModel": {
    "CardHolderName": "Fjj",
    "CardNumber": "555",
    "CardExpiryMonth": 1,
    "CardExpiryYear": 2018
    ......
}

}

2 个答案:

答案 0 :(得分:0)

首先,您需要一个方法/计算属性,将您的模型转换为类型为[String: AnyObject][String: Any]的字典。 然后,不要将模型添加到参数字典中,而是添加模型字典,如下例所示。

class CardModel: NSObject {
    var expiryYear: Int?
    var expiryMonth: Int?
    var cardNumber: String?
    var cardHolderName: String?


    var jsonDict: [String: AnyObject] {
        var json: [String: AnyObject] = [:]//Initializing an Empty Dictionary
        json["expiryYear"] = expiryYear as AnyObject // Inserting expiryYear into Dictionary
        json["expiryMonth"] = expiryMonth as AnyObject // Inserting expiryMonth into Dictionary
        json["cardNumber"] = cardNumber as AnyObject // Inserting cardNumber into Dictionary
        json["cardHolderName"] = cardHolderName as AnyObject // Inserting cardHolderName into Dictionary
        return json // returning newly populated dictionary
    }
}

func requestToServer(cardModel: CardModel) {
    var parameters = [String: AnyObject]()
    parameters["ApiKey"] = "dfv12345df234t" as AnyObject
    parameters["cardModel"] = cardModel.jsonDict as AnyObject// adding card model dictionary into you paramters dictionary.

    //Same logic will be use for your next clientModel
}

答案 1 :(得分:0)

我建议您阅读Codable protocol,这是将基本Swift类型映射到JSON数据的一种非常优雅的方式。游乐场将为您提供以下

import Cocoa

let jsonData = """
{
    "ApiKey": "XXX-XXX-XXX",
    "cardModel": {
        "CardHolderName": "Fjj",
        "CardNumber": "555",
        "CardExpiryMonth": 1,
        "CardExpiryYear": 2018
    }
}
""".data(using: .utf8)!
// ... missing here (but added a closing brace for cardModel

struct CardModel: Codable {
    let holderName: String
    let number: String
    let expiryMonth: Int
    let expiryYear: Int

    enum CodingKeys: String, CodingKey {
        case holderName = "CardHolderName"
        case number = "CardNumber"
        case expiryMonth = "CardExpiryMonth"
        case expiryYear = "CardExpiryYear"
    }
}

struct ApiCardPayment: Codable {
    let apiKey: String
    let cardModel: CardModel

    enum CodingKeys: String, CodingKey {
        case apiKey = "ApiKey"
        case cardModel
    }
}

do {
    let apiPayment = try JSONDecoder().decode(ApiCardPayment.self, from:jsonData)
    print(apiPayment)
} catch {
    print(error)
}

这比你可能不得不解释的[String:AnyObject]施法噩梦容易得多。除了JSONDecoder的错误信息一直在迅速改善之外,它现在相当擅长指出出了什么问题。

P.S。:当然还有JSONEncoder().encode(),但这只是容易的部分。