您好我是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
......
}
}
答案 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()
,但这只是容易的部分。