You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 18:42:02