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

Swift中将对象数组转为JSON字符串用于API调用时报错如何解决

错误产生原因

你使用的JSONSerialization仅支持序列化Foundation内置桥接类型(包括NSString、NSNumber、NSArray、NSDictionary等),自定义的Swift NotificationModel结构体不属于它支持的类型范围,传入后会触发运行时异常。之前[String]类型数组可以正常转换是因为Swift字符串可自动桥接为NSString,符合JSONSerialization的参数要求。

正确实现方式

你已经为NotificationModel声明了Codable协议,直接使用Swift原生的JSONEncoder做序列化即可,这是处理Codable类型的官方标准方案,适配所有符合Encodable协议的类型:

let data = ["123","1234"]

let data2 = [NotificationModel(version: "2", bigPicture: "data"),
                 NotificationModel(version: "3", bigPicture: "data")]

struct NotificationModel: Codable {
    var version : String?
    var bigPicture : String?
}

// 通用Codable类型转JSON字符串方法,兼容所有Encodable类型
func json<T: Encodable>(from object: T) -> String? {
    let encoder = JSONEncoder()
    // 如果需要格式化输出可开启下面的配置
    // encoder.outputFormatting = .prettyPrinted
    guard let data = try? encoder.encode(object) else {
        return nil
    }
    return String(data: data, encoding: .utf8)
}

print("\(json(from:data2) ?? "转换失败")")
print("\(json(from: data) ?? "转换失败")")

执行后输出的结果为标准JSON格式:[{"version":"2","bigPicture":"data"},{"version":"3","bigPicture":"data"}],直接满足接口调用要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 21:27:05