首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Swift 4中用JSONEncoder编码词典

如何在Swift 4中用JSONEncoder编码词典
EN

Stack Overflow用户
提问于 2018-01-31 14:06:48
回答 2查看 12.3K关注 0票数 6

我想用JSONEncoder把字典编码成json。它似乎是一个请求,接收一个字典作为参数,并将其编码为json作为http。代码如下所示:

代码语言:javascript
复制
let dict = ["name": "abcde"]

protocol Request {
    var params: [String: Encodable] { get set }
    func encode<T>(_ value: T) throws -> Data where T : Encodable
}

extension Request {
    func encode<T>(_ value: T) throws -> Data where T : Encodable {
        return try JSONEncoder().encode(value)
    }

    var body: Data? {
        if let encoded = try? self.encode(self.params) {
            return encoded
        }
        return nil
    }
}

struct BaseRequest: Request {
    var params: [String : Encodable]
}

let req = BaseRequest(params: dict)
let body = req.body

但是这段代码会发生错误

致命错误: Dictionary不符合Encodable,因为Encodable不符合它本身。您必须使用具体类型来编码或解码。

我怎么能让这个编码?

EN

回答 2

Stack Overflow用户

发布于 2018-01-31 14:35:00

您必须引入类型擦除如下:

代码语言:javascript
复制
struct AnyEncodable: Encodable {

    let value: Encodable
    init(value: Encodable) {
        self.value = value
    }

    func encode(to encoder: Encoder) throws {
        try value.encode(to: encoder)
    }

}

struct Model: Encodable {

    var params: [String: AnyEncodable]

}

let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
let json = try! encoder.encode(
    Model(
        params: [
            "hello" : AnyEncodable.init(value: "world")
        ]
    ).params
)
print(String(data: json, encoding: .utf8))
票数 3
EN

Stack Overflow用户

发布于 2018-01-31 14:36:29

如果您想将您的结构定义为符合Codable,您可以这样做:

代码语言:javascript
复制
struct Model: Codable {
    var param1: String
    var param2: Int
}

let model = Model(param1: "test", param2: 0)
let encoded = try? JSONEncoder().encode(model)
let decoded = try? JSONDecoder().decode(Model.self, from: encoded!)

如果您设置params: [String: Any],它将不会真正工作,因为编码器/解码器不知道如何编码/解码Any,但它们可以对原始类型进行编码/解码。

如果您需要更多的帮助,您应该阅读更多关于新Codable协议的内容。我推荐如下:https://hackernoon.com/everything-about-codable-in-swift-4-97d0e18a2999

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48544098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档