为什么Socket返回的响应数据无法解码为我定义的Swift Decodable类型?
错误原因
你调用JSONSerialization.data(withJSONObject:)时传入的参数是dict["msg"],这个值是服务端发来的字符串内容(比如only socket: xxx can see this),而JSONSerialization要求传入的顶级序列化对象必须是数组或者字典类型,传入普通字符串会直接抛出你遇到的Invalid top-level type in JSON write错误。
同时你的解码逻辑存在偏差:你定义的Msg类本身就对应服务端发送的完整{msg: "xxx"}结构,不需要单独提取msg字段再解码。
修复后的客户端代码
socket.on("Message for me") { data, ack in do { // 直接取出服务端发送的完整字典结构 guard let msgDict = data[0] as? [String: Any] else { return } // 将完整字典转成Data,再解码为Msg类型 let jsonData = try JSONSerialization.data(withJSONObject: msgDict) let decoded = try JSONDecoder().decode(Msg.self, from: jsonData) print("Message from socket: \(decoded.msg)") } catch { print(error.localizedDescription) } }
可选优化方案
如果你使用的是Socket.IO-Client-Swift库,可以直接用内置的解码能力,跳过手动JSON序列化步骤,代码更简洁:
socket.on("Message for me") { data, ack in do { let decoded = try data[0].decode(as: Msg.self) print("Message from socket: \(decoded.msg)") } catch { print(error.localizedDescription) } }
内容的提问来源于stack exchange,提问作者Tank12
相关产品推荐
相关产品推荐

