Swift Codable - 如何编码和解码字符串化的 JSON 值?



我正在与之交谈的服务器需要以下格式的消息:

{
"command": "subscribe",
"identifier": "{"channel": "UserChannel"}",
"data": "{"key": "value"}"
}

其中,identifierdata值是转义的 json 字符串。

到目前为止,我有这个:

struct ActionCableMessage<Message: Encodable>: Encodable {
let command: Command
let identifier: CableChannel
let data: Message?
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(command, forKey: .command)
try container.encode(identifier, forKey: .identifier) // ????
}
private enum CodingKeys: String, CodingKey {
case command, identifier, data
}
}

但我不知道从这里开始做什么。我认为我需要一个CableChannelMessage可以遵守的protocol,并提供一个实现encode (to encoder: Encoder)extensionfunc,确保Encoder必须是JSONEncoder,如果是这样,使用它来重写它自己的值作为转义的 json 字符串。

我还需要将其解码回ActionCableMessage结构,但我还没有走那么远。

我想我需要一个有线频道和消息可以符合的协议

好吧,该协议是Encodable的(如果您愿意,也可以Codable(。

// just implement these as you normally would
extension CableChannel : Encodable { ... }
extension Message : Encodable { ... }

然后在ActionCableMessage中,使用另一个编码器将内部对象编码为 JSON 数据,然后将其转换为字符串,然后对该字符串进行编码:

func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(command, forKey: .command)
let subencoder = JSONEncoder()
let identifierString = try String(data: subencoder.encode(identifier), encoding: .utf8)

try container.encode(identifierString, forKey: .identifier)
// do the same for "data"
}

同样用于解码:

init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
command = try container.decode(String.self, forKey: .command)
let identifierJSONString = try container.decode(String.self, forKey: .identifier)
// do the same for "data"

let subdecoder = JSONDecoder()
identifier = try subdecoder.decode(CableChannel.self, from: identifierJSONString.data(using: .utf8)!)
// do the same for "data"
}

相关内容

  • 没有找到相关文章

最新更新