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

Swift中获取对象数组JSON报错:Array<action>未遵循Encodable协议

解决Swift中数组转JSON的Encodable错误

咱先把问题拆明白:这个报错直白告诉你,你用来存数据的action类型(不管是结构体还是类)没实现Encodable协议——而Swift里数组能不能转JSON,全看它里面的元素支不支持Codable(Encodable是Codable的一部分,通常直接用Codable更方便,因为后续解码也能用)。

核心解决方案:让action类型遵循Codable

先纠正个Swift编码规范:类型名首字母要大写,所以咱把action改成Action,避免风格问题也更符合社区约定。

情况1:如果是结构体(推荐用结构体存数据)

结构体只要属性都遵循Codable,编译器会自动帮你生成Codable的实现,不用写额外代码:

// 直接让结构体遵循Codable
struct Action: Codable {
    var name: String
    var duration: Int
    // 其他你需要的属性,比如Bool、Double这些基本类型都默认支持Codable
}

情况2:如果是类

纯Swift类同样可以直接遵循Codable,只要属性都支持Codable,编译器也会自动生成实现:

class Action: Codable {
    var name: String
    var duration: Int
    
    // 如果你写了自定义的初始化器,需要额外实现required init(from decoder: Decoder) throws
    // 没写自定义初始化器的话,不用加任何额外代码
}

验证:把数组转成JSON字符串

当Action遵循了Codable,[Action]数组会自动获得Encodable能力,直接用JSONEncoder编码就行:

// 创建测试数组
let actions: [Action] = [
    Action(name: "跑步", duration: 30),
    Action(name: "跳跃", duration: 10)
]

// 编码成JSON
do {
    let jsonData = try JSONEncoder().encode(actions)
    if let jsonString = String(data: jsonData, encoding: .utf8) {
        print("生成的JSON:\(jsonString)")
        // 输出会是类似:[{"name":"跑步","duration":30},{"name":"跳跃","duration":10}]
    }
} catch {
    print("编码失败:\(error.localizedDescription)")
}

特殊情况:如果Action里有不支持Codable的属性

比如你用了自定义的非Codable类型,那要么让这个子类型也遵循Codable,要么手动实现编码逻辑:

// 比如这个自定义类型,先让它遵循Codable
struct CustomStatus: Codable {
    var isCompleted: Bool
}

struct Action: Codable {
    var status: CustomStatus // 现在这个属性也支持Codable了
    var name: String
}

// 如果是没法遵循Codable的类型,手动实现encode方法
struct Action: Encodable {
    var someSpecialValue: SomeNonCodableType
    
    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        // 把特殊类型转成Codable支持的格式,比如字符串
        try container.encode(someSpecialValue.toString(), forKey: .someSpecialValue)
    }
    
    // 定义编码用的key
    enum CodingKeys: String, CodingKey {
        case someSpecialValue
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:25:22