You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:02:12