【问题标题】:Ios how to post multiple Custom objects using Alamofireios如何使用Alamofire发布多个自定义对象
【发布时间】:2018-10-05 15:11:26
【问题描述】:

您好,我是 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

那我现在该怎么办????请帮忙

更新1: 这是我的端点的有效 json(从 android 发送)

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

}

【问题讨论】:

  • 这取决于您的 API,您的 API 是否需要 JSON 中的 JSON?如果不是,请不要这样做,而只需执行"clientModel" : clientModelDictionaryVersion,而不是 JSONString 之一。如果你不能轻松地做回来,只需将其转换为 utf8 中的数据,然后使用 JSONSerialization 将该数据转换为字典。
  • 我已经转换了它,并且我的端点需要答案中发布的格式的数据。刚刚更新现在检查答案
  • 这不是 JSON 中的 JSON。因此,不要使用clientModel,而是发送帮助您构造字符串的字典。
  • 我没有得到你
  • 我只是想知道如何将 cardModel (即 string )放入参数字典中

标签: ios json swift alamofire


【解决方案1】:

首先,您需要有一个方法/计算属性,可以将您的模型转换为[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
}

【讨论】:

    【解决方案2】:

    我建议您阅读Codable protocol,这是将基本 Swift 类型映射到 JSON 数据的一种非常优雅的方式。 Playground 将帮助您解决以下问题

    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(),但这只是简单的部分。

    【讨论】:

      猜你喜欢
      • 2015-07-06
      • 1970-01-01
      • 2015-07-16
      • 2015-09-30
      • 2011-04-05
      • 2018-07-07
      • 2018-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多