如何用ObjectMapper和Alamofire提交嵌套JSON?请求数据为空求助
问题:Swift请求模型与POST API结构不匹配导致请求无返回数据
我需要为POST API构造如下请求JSON:
{"TokenId": "xxxxxx-xxxxx-xxxx-xxx", "ObjSearch": { "UserId":"0", "FromDate":"", "StateId":"0", "DistrictId":"0", "ToDate":"" } }
目前我基于ObjectMapper创建了两个请求模型:
class ChartsReqModel: NSObject, Mappable { var TokenId:String? var ObjSearch : [ChartObjSearchReqModel]? }
以及:
class ChartObjSearchReqModel: NSObject,Mappable { var FromDate:String? var ToDate:String? var StateId:String? var DistrictId:String? var UserId:String? var ProductId:String? var SalesChannelId:String? var ReporteesId:String? var `Type`:String? func mapping(map: Map) { FromDate <- map["FromDate"]; ToDate <- map["ToDate"]; StateId <- map["StateId"]; DistrictId <- map["DistrictId"]; UserId <- map["UserId"]; ProductId <- map["ProductId"]; SalesChannelId <- map["SalesChannelId"]; ReporteesId <- map["ReporteesId"]; Type <- map["Type"]; } }
用Postman调用API能得到理想响应,但代码发送请求时,接口返回Data = ( );。作为Swift新手,我找不到问题所在,恳请帮忙解决。
问题定位
核心问题是你的请求模型结构和API要求的JSON完全不匹配:
API需要的ObjSearch是一个单个对象(用{}包裹),但你在ChartsReqModel里把ObjSearch定义成了数组类型([ChartObjSearchReqModel]?)。这会导致ObjectMapper序列化出来的JSON里,ObjSearch要么是空数组[],要么根本不符合接口预期的结构,最终接口无法识别请求,返回空数据。
另外,你还漏写了Mappable协议要求的init?(map: Map)初始化方法,这也可能导致模型序列化失败。
解决方案
1. 修正ChartsReqModel的ObjSearch类型
把数组类型改成单个对象类型,并补充Mappable要求的初始化和mapping方法:
class ChartsReqModel: NSObject, Mappable { var TokenId: String? // 从数组改为单个对象 var ObjSearch: ChartObjSearchReqModel? // Mappable必须实现的初始化方法 required init?(map: Map) {} func mapping(map: Map) { TokenId <- map["TokenId"] ObjSearch <- map["ObjSearch"] } }
2. 完善ChartObjSearchReqModel的Mappable实现
补充缺失的init?(map: Map)方法:
class ChartObjSearchReqModel: NSObject, Mappable { var FromDate: String? var ToDate: String? var StateId: String? var DistrictId: String? var UserId: String? var ProductId: String? var SalesChannelId: String? var ReporteesId: String? var `Type`: String? // 必须添加这个初始化方法 required init?(map: Map) {} func mapping(map: Map) { FromDate <- map["FromDate"] ToDate <- map["ToDate"] StateId <- map["StateId"] DistrictId <- map["DistrictId"] UserId <- map["UserId"] ProductId <- map["ProductId"] SalesChannelId <- map["SalesChannelId"] ReporteesId <- map["ReporteesId"] Type <- map["Type"] } }
3. 正确序列化模型并发送请求
确保把模型正确转为JSON Data,并且设置请求头的Content-Type为application/json:
// 构造搜索参数模型 let searchParams = ChartObjSearchReqModel() searchParams.UserId = "0" searchParams.StateId = "0" searchParams.DistrictId = "0" // 其他字段按需赋值,比如FromDate、ToDate等 // 构造完整请求模型 let requestModel = ChartsReqModel() requestModel.TokenId = "xxxxxx-xxxxx-xxxx-xxx" requestModel.ObjSearch = searchParams // 序列化模型为JSON字典 guard let jsonDictionary = requestModel.toJSON() else { print("模型序列化失败") return } // 转换为JSON Data do { let jsonData = try JSONSerialization.data(withJSONObject: jsonDictionary, options: []) // 构造POST请求 var request = URLRequest(url: URL(string: "你的API地址")!) request.httpMethod = "POST" request.setValue("application/json", forHTTPHeaderField: "Content-Type") request.httpBody = jsonData // 发送请求(这里用URLSession示例) let task = URLSession.shared.dataTask(with: request) { data, response, error in if let error = error { print("请求错误:\(error)") return } // 处理返回数据 if let data = data { print("返回数据:\(String(data: data, encoding: .utf8)!)") } } task.resume() } catch { print("JSON转换失败:\(error)") }
额外检查点
- 确认你已经正确集成了ObjectMapper(比如通过CocoaPods或Swift Package Manager)
- 发送请求前,打印
jsonDictionary,对比Postman里的请求体,确保结构完全一致 - 检查API地址、请求头是否和Postman里的配置完全相同
内容的提问来源于stack exchange,提问作者Tanya Sinha
相关产品推荐
相关产品推荐

