面试题答案
一键面试构建请求参数
- 将复杂数据结构转换为JSON数据:
- 使用
JSONSerialization
将数组、字典等复杂数据结构转换为JSON数据。例如,如果有一个字典parametersDict
:
let parametersDict = ["key1": "value1", "key2": [1, 2, 3], "key3": ["subKey": "subValue"]] guard let jsonData = try? JSONSerialization.data(withJSONObject: parametersDict) else { return }
- 使用
- 使用Alamofire发送POST请求:
- 设置请求头
Content - Type
为application/json
。 - 将转换后的JSON数据作为请求体发送。
Alamofire.request(url, method:.post, parameters: nil, encoding: JSONEncoding.default, headers: ["Content - Type": "application/json"]).responseJSON { response in // 处理响应 }
- 设置请求头
解析响应数据
- 使用
JSONDecoder
:- 创建与响应JSON结构对应的结构体。例如,如果响应JSON结构如下:
{ "data": { "items": [ { "id": 1, "name": "item1" }, { "id": 2, "name": "item2" } ] } }
- 定义对应的结构体:
struct Root: Codable { let data: DataObject } struct DataObject: Codable { let items: [Item] } struct Item: Codable { let id: Int let name: String }
- 解析响应数据:
guard let data = response.data else { return } let decoder = JSONDecoder() do { let root = try decoder.decode(Root.self, from: data) // 处理解析后的root对象 } catch { print("解析错误: \(error)") }
解析过程中可能遇到的问题及解决方案
- JSON数据格式不匹配:
- 问题:响应的JSON数据结构与定义的结构体不匹配,例如缺少某个字段或者字段类型不一致。
- 解决方案:
- 在结构体定义中使用
optional
关键字修饰可能缺失的字段。例如:
struct Item: Codable { let id: Int let name: String? }
- 使用
CodingKeys
来处理JSON中字段名与结构体属性名不一致的情况。例如:
struct Item: Codable { let itemID: Int let itemName: String enum CodingKeys: String, CodingKey { case itemID = "id" case itemName = "name" } }
- 在结构体定义中使用
- 数据类型转换错误:
- 问题:例如JSON中的数字被解析为
Int
,但实际是Double
类型。 - 解决方案:在定义结构体属性时,使用更通用的数据类型,如
Any
,然后在解析后进行类型检查和转换。或者根据实际情况,将属性定义为更合适的类型,如Double
。
- 问题:例如JSON中的数字被解析为
- 嵌套结构解析复杂:
- 问题:多层嵌套的JSON结构使得结构体定义和解析变得复杂。
- 解决方案:逐步拆解嵌套结构,为每一层嵌套定义独立的结构体,这样可以使代码更清晰,便于维护和调试。同时,可以使用
extension
为结构体添加辅助方法来处理特定的解析逻辑。