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

Swift中PubNub消息无法转换为JSON的问题求助

PubNub 接收JSON字典崩溃:__NSCFString无法转为NSDictionary

这个问题我之前帮好几个开发者排查过类似的情况,核心原因是发送端的JSON对象没有以正确的格式传递给PubNub,导致接收端拿到的其实是字符串而非预期的字典类型,进而触发类型转换崩溃。

先排查发送端的核心问题

你目前给出的发送端代码只创建了字典,但没有展示实际的PubNub发送逻辑。很大概率是你在发送时错误地将字典转成了字符串(比如用了description或者手动拼接字符串),而非直接传递字典对象。

错误示例(导致接收端拿到字符串):

var json = [String : Any]()
json["lat"] = 33.923892
json["long"] = 73.232873
json["userId"] = "abc"

// 错误:把字典转成字符串再发送,PubNub会直接传递这个字符串
let wrongMessage = "\(json)"
pubnub.publish(channel: "your-channel", message: wrongMessage)

正确的发送方式:

PubNub支持直接发送Swift字典,它会自动帮你完成JSON序列化,不需要手动转换:

var json = [String : Any]()
json["lat"] = 33.923892
json["long"] = 73.232873
json["userId"] = "abc"

// 正确:直接传递字典对象
pubnub.publish(channel: "your-channel", message: json) { result in
    switch result {
    case .success(let publishResult):
        print("消息发送成功,时间戳:\(publishResult.timetoken)")
    case .failure(let error):
        print("发送失败:\(error.localizedDescription)")
    }
}

如果发送端没问题,接收端做兼容处理

如果确认发送端是直接传字典,但接收端还是拿到字符串,可能是中间环节(比如PubNub的配置或者第三方代理)导致格式被转成了字符串。这时候接收端需要先判断类型,再做对应的解析:

// 先判断拿到的是字符串还是字典
if let info = message.data.message.value as? [String: Any] {
    // 直接使用字典
    print("纬度:\(info["lat"] as? Double ?? 0)")
    print("经度:\(info["long"] as? Double ?? 0)")
    print("用户ID:\(info["userId"] as? String ?? "")")
} else if let jsonString = message.data.message.value as? String,
           let jsonData = jsonString.data(using: .utf8) {
    // 如果是JSON字符串,先反序列化为字典
    do {
        if let info = try JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any] {
            print("解析后的纬度:\(info["lat"] as? Double ?? 0)")
        }
    } catch {
        print("JSON解析失败:\(error)")
    }
} else {
    print("无法识别的消息格式")
}

额外排查点

  • 检查发送端的字典是否包含PubNub不支持的类型(比如自定义对象),但你目前的字典只有Double和String,都是支持的,这个可以排除。
  • 确认PubNub的客户端版本是否是最新的,旧版本可能存在序列化兼容问题。

内容的提问来源于stack exchange,提问作者kinza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:33:19