ios - 在键中嵌套 JSON 字典?

标签 ios json swift alamofire codable

我需要在 key 中发送一个请求,希望它看起来像这样:

 {
  "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]
}

我的逻辑是这将在用户父键中创建子键值对,但是我的应用在尝试时出现 fatal error :

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)/类型:

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())

关于ios - 在键中嵌套 JSON 字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55326731/

相关文章:

ios - Xcode 8 导入 StoreKit.framework 在归档时导致错误

Java 和 json 对象

javascript - 占位符上的 Node 、表达和请求显示批处理\n

ios - 导航 Controller 委托(delegate)方法没有得到调用

ios - 检测 SWIFT 3 上的互联网连接是否可用(WIFI 和 4G)

ios - 如何将 “downcast” 的[NSManageObject]数组添加到所选实体中?

ios - 如何在表格 View 单元格中设置色调/突出显示颜色?

java - 字符串到数组 Java 到 Json 对象

ios - 凯撒密码在 Swift 上解密时出错

ios - UIPoverController 每次使用时都会创建实时字节