ios - 我想使用 Alamofire swift 4 发布对象数组
问题描述
这是我试图发布的 JSON,它有名为 Menus 的 JSON 数组,里面有菜单对象
{
"Menus":[
{
"Id":"5ae03b8e90435721f465050c",
"Name":"testmenu2"
},
{
"Id":"5ae03f4490435721f465051b",
"Name":"menu1"
}
],
"InStock":true,
"Pricing":{
"Price":1000,
"SaleEnd":"2018-04-20",
"SaleStart":"2018-04-20",
"SalePrice":120
},
"Sku":"chickenkoththutest",
"PreparationTime":{
"MinCount":"0",
"MinTime":"0",
"AdditionalPerItem":"0"
},
"Name":"chickenkoththutest",
"BusinessId":"5adda52c90435519b0c31aff",
"Attributes":[
],
"Cuisines":[
],
"Description":"none"
}
这是我正在遵循的方法,但所有其他细节都在提交,但对象数组除外。首先,我将对象转换为字典并将它们附加到数组中。发布单个字典对象正在工作,但是当我将它们附加到数组中并尝试发布它时无法发布。有没有办法使用 Alamofire 发布对象数组
func AddMenuItem(deviceToken:String,Name:String,Sku:String,BusinessId:String,Pricing:Pricing,Menus:[Menus],Cuisines:[Cuisines],Attributes:[Attributes],Description:String,Instock:Bool,PreparationTime:PreparationTime,_ completion: @escaping (_ sucsessStatus:String, _ id:String,_ error_type:String)->()) {
let headers = [
"Authorization": "Bearer " + deviceToken,
"Accept": "application/json"
]
var categories = [AnyObject]()
var attributeList = [AnyObject]()
var cuisineList = [AnyObject]()
var options = [AnyObject]()
for menu in Menus{
if(Menus.count != 0){
let Cat: NSMutableDictionary = NSMutableDictionary()
Cat.setValue(menu._Id, forKey: "Id")
Cat.setValue(menu.Name, forKey: "Name")
// let array = JSON(Cat)
categories.append(Cat)}
}
for cuisine in Cuisines{
if(Cuisines.count != 0){
let Cat: NSMutableDictionary = NSMutableDictionary()
Cat.setValue(cuisine._Id, forKey: "Id")
Cat.setValue(cuisine.Name, forKey: "Name")
// let array = JSON(Cat)
cuisineList.append(Cat)}
}
for attr in Attributes{
if(Attributes.count != 0){
let Cat: NSMutableDictionary = NSMutableDictionary()
Cat.setValue(attr._Id, forKey: "Id")
Cat.setValue(attr.Name, forKey: "Name")
// let array = JSON(Cat)
attributeList.append(Cat)}
}
for option in OptioList.options{
if(OptioList.options.count != 0){
let Cat: NSMutableDictionary = NSMutableDictionary()
Cat.setValue(option.price, forKey: "Price")
Cat.setValue(option.Desc, forKey: "Description")
Cat.setValue(option.isrequired, forKey: "IsRequired")
// let array = JSON(Cat)
options.append(Cat)}
}
let prepared: NSMutableDictionary = NSMutableDictionary()
prepared.setValue(PreparationTime.MinTime, forKey: "MinTime")
prepared.setValue(PreparationTime.MinCount, forKey: "MinCount")
prepared.setValue(PreparationTime.AdditionalPerItem, forKey: "AdditionalPerItem")
//let pre = JSON(prepared)
let pricingdata: NSMutableDictionary = NSMutableDictionary()
pricingdata.setValue(Pricing.Price, forKey: "Price")
pricingdata.setValue(Pricing.SalePrice, forKey: "SalePrice")
pricingdata.setValue(Pricing.SaleStart, forKey: "SaleStart")
pricingdata.setValue(Pricing.SaleEnd, forKey: "SaleEnd")
// let pricingd = JSON(pricingdata)
let param = [ "Name" : Name,
"BusinessId" : BusinessId,
"Sku" : Sku,
"Menus":categories,
"Cuisines":cuisineList,
"Attributes":attributeList,
"Description":Description,
"PreparationTime": prepared ,
"Pricing":pricingdata,
"Customizations":options
] as [String : Any]
self._webApiHelper.SendHttpRequest(params: param as AnyObject, header_obj: headers, url: "Vendor/Menu/Items/Add", http_method: .post) { (response_value, error) in
print(response_value)
if(error != "NO_INT"){
if(response_value["Message"].string! == "SUCCESS")
{
completion(response_value["Message"].string! ,response_value["Id"].string!,"")
}
else{
completion(response_value["Message"].string!,"" ,"")
}
}
else{
completion( "","",response_value["Message"].string!)
}
}//SendHttpRequest
}
这是 webapihelper 方法
var BASE_URL : String = "http://portal.blueicon.lk/api/"
var TOKEN_URL: String = "http://portal.blueicon.lk/token"
func SendHttpRequest(params: AnyObject, header_obj: [String: String], url:String, http_method:HTTPMethod, completion: @escaping (_ response_value: JSON, _ error_type: String)->()) {
Alamofire.request(BASE_URL + url, method: http_method, parameters: (params as! [String : Any]) , encoding: URLEncoding.default, headers: header_obj).responseJSON { (response:DataResponse<Any>) in
switch(response.result) {
case .success( _ ):
if let jsonValue = response.result.value {
let json = JSON(jsonValue)
completion(json, "")
}
break
case .failure(_):
print(response.result.error!)
completion(JSON(response.result.value), "NO_INT")
//"The Internet connection appears to be offline."
break
}
}//Alamofire
}//SendHttpRequest
解决方案
您的代码中的问题:
"Pricing":pricingdata
你不能在参数中传递字典。
解决方案:
您需要将字典转换为 JSON 字符串,然后只有您的问题才能解决使用此扩展名将参数中传递的字符串转换为字符串。
extension NSDictionary {
func toJSonString() -> String {
let dict = self
var jsonString = "";
do {
let jsonData = try JSONSerialization.data(withJSONObject: dict, options: .prettyPrinted)
jsonString = NSString(data: jsonData, encoding: String.Encoding.utf8.rawValue)! as String
} catch {
print(error.localizedDescription)
}
return jsonString;
}
}
我希望它会奏效。
推荐阅读
- javascript - 如何在文本组件中呈现复活值?
- trusted-web-activity - 从 Google Play 安装后首次运行
- sql - 如何检查 sql 数据库表字段 null 或 0,如果是,则将其替换为其他列
- r - 随机森林的 AUC - 不同的方法,不同的答案?
- angular - if else 在Angular 8+中的ngFor循环内
- go - 无法导入包
- vue.js - 如何访问 vue.js 中以编程方式创建的引用?
- linux - 为什么线程中的 sleep() 不能被代码中的信号中断?
- mysql - 如何将返回多个列的两个 SQL 查询组合到同一个表的不同列中?
- cypress - 使用命令 Cypress Open 从该位置调用 cypress 时出现以下错误