ios - 在键中嵌套 JSON 字典?
问题描述
我需要在密钥中发送一个请求,期望它看起来像这样:
{
"user": {
"email": String,
"password": String
}
}
我试图通过创建一个UserSignupRequest
具有电子邮件和密码属性并符合可编码的方法来做到这一点:
struct UserSignupRequest: Codable {
let email: String
let password: String
enum CodingKeys: String, CodingKey {
case email
case password
}
}
然后通过以下方式为 alamofire 创建参数:
case .signup(let request):
return ["user": request]
}
我的逻辑是这将在用户父键中创建子键值对,但是我的应用程序在尝试时出现致命错误:
urlRequest.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: [])
我确定解决方案很简单,但我不能让它工作!非常感谢
解决方案
JSON序列化
JSONSerialization
仅适用于简单类型,如数组、字典、字符串、数字等。
如果您想使用它,那么您不需要Codable
,而是需要func toDict() -> [String: Any]
将您转换UserSignupRequest
为字典的功能。
然后您的开关将如下所示:
case .signup(let request):
return ["user": request.toDict()]
}
JSON编码器
JSONSerialization
是旧 api,如果您打算使用,则Codable
需要使用:
urlRequest.httpBody = try JSONEncoder().encode(parameters)
无法推断通用参数“T”
我假设你得到如下参数:
func parameters(for request: RequestType) -> [String: Any] {
switch request {
case .signup(let request):
return ["user": request]
}
}
因此,当您在编码器中传递参数时,他不知道要编码什么类型。
为了解决这个问题,我们不仅可以返回字典,还可以返回特定的协议/类型:
protocol Request {
func encode(by encoder: JSONEncoder) throws -> Data
}
extension Request where Self: Encodable {
func encode(by encoder: JSONEncoder) throws -> Data {
/// since it will be method on specific type, JSONEncoder will know what type is encoding
return try encoder.encode(self)
}
}
struct UserSignupRequest: Codable, Request {
struct RequestData: Codable {
let email: String
let password: String
}
let data: RequestData
enum CodingKeys: String, CodingKey {
case data = "user"
}
}
func parameters(for request: RequestType) -> Request {
switch request {
case .signup(let requestData):
return UserSignupRequest(data: requestData)
}
}
所以现在你可以做
urlRequest.httpBody = try parameters.encode(by: JSONEncoder())
推荐阅读
- apache - Rewriterule 从 url 中删除 index.php for codeigniter 导致重定向过多
- android - 仅在特定屏幕中对物理后退按钮按下执行减速器操作以响应本机
- python - TypeError: __init__() 应该返回 None,而不是 'dict'
- excel - Excel 公式可根据多个标准查找进入建筑物的人员的第 1、第 2、第 3 个最小出现次数
- svg - 寻找一种将 SVG/Points 转换为文本(不是 OCR)的方法
- apache-kafka - kafka 是否具备规则引擎的能力?
- html - 无法居中对齐绝对定位thead tr th div的单个div
- wpf - 数据绑定 WPF 从 mysql 数据库 Vb.net 填充组合框
- python - Python点曲线
- javascript - 在 ReactJS 中返回两个相同的属性而不是一个