【发布时间】:2018-10-19 16:46:56
【问题描述】:
这是我的场景:我有一个 swift WebSocket 服务器和一个 Javascript 客户端。在同一个 WebSocket 上,我将发送对应于不同 Codable types 的各种对象。如果知道正确的类型,则解码很简单。对我来说,困难在于确定客户端发送的是哪种类型。我的第一个想法是 使用如下所示的 JSON:
{type: "GeoMarker",
data: {id: "2",
latitude: "-97.32432"
longitude: "14.35436"}
}
这样我就知道使用let marker = try decoder.decode(GeoMarker.self) 解码data
这似乎很简单,但由于某种原因,我不知道如何将data 对象提取为 JSON,以便我可以使用 GeoMarker 类型对其进行解码。
我想出的另一个解决方案是创建一个像这样的中间类型:
struct Communication: Decodable {
let message: String?
let markers: [GeoMarker]?
let layers: [GeoLayer]?
}
这样我可以发送以下格式的 JSON:
{message: "This is a message",
markers: [{id: "2",
latitude: "-97.32432"
longitude: "14.35436"},
{id: "3",
latitude: "-67.32432"
longitude: "71.35436"}]
}
并使用let com = try decoder.decode(Communication.self) 并打开可选的消息、标记和图层变量。这可行,但看起来很笨重,特别是如果我需要更多类型。毕竟,我可能最终需要 8-10。
我已经考虑过了,但我觉得我没有想出一个令人满意的解决方案。会有更好的方法吗?这种事情有我不知道的标准吗?
----编辑----
作为一个自然的后续,在上述相同情况下,您将如何编码为相同的 JSON 格式?
【问题讨论】:
-
不清楚是什么问题。当您不知道 JSON 的类型/结构时使用 JSONDecoder 的困难已经在这里进行了深入讨论,因此在某种程度上这是重复的。而且您还没有展示给您带来麻烦的 JSON 样本,因此您没有提供 MCVE,除了毫无意义的概括性之外,您无法提供帮助。总而言之,当您不知道 JSON 将是什么时,JSONDecoder 不适合您。
-
我会推荐第一种方法。来自服务器的 JSON 应该有 2 个键:
type是一个字符串,data可以是任何东西。你如何解码data取决于type。
标签: json swift websocket jsondecoder