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

Swift中如何为包含不同数据类型的JSON数组创建Codable模型?

解决方案

核心难点是你遇到的是固定长度的异构JSON数组,第一个元素为字符串类型,第二个为结构化对象,需要手动实现MixedData的编解码逻辑:

完整模型代码

// 先定义getSomeObjectArray的元素类型,按接口实际返回的字段补充属性即可
struct Object: Codable {
    // 示例:如果数组内元素有id、name属性就在这里声明
}

struct GetSomeData: Codable {
    let getSomeString: String
    let getSomeObjectArray: [Object]
}

struct MixedData: Codable {
    let address: String
    let content: GetSomeData
    
    // 手动实现解码逻辑
    init(from decoder: Decoder) throws {
        var container = try decoder.unkeyedContainer()
        // 按数组索引顺序依次解码对应类型
        address = try container.decode(String.self)
        content = try container.decode(GetSomeData.self)
    }
    
    // 如果需要把模型转回JSON,补充以下编码实现
    func encode(to encoder: Encoder) throws {
        var container = encoder.unkeyedContainer()
        try container.encode(address)
        try container.encode(content)
    }
}

// 原有其他模型保持不变即可
struct RequestMyData: Codable {
    let id: String
    let timeUsed: Int
    let input: [MixedData]
    let output: [MixedData]
    let getSomeData: GetSomeData
}

struct RequestData: Codable {
    let data: [RequestMyData]
}

解码使用示例

// jsonData为接口返回的二进制数据
do {
    let result = try JSONDecoder().decode(RequestData.self, from: jsonData)
    // 取值示例
    if let firstInput = result.data.first?.input.first {
        print(firstInput.address) // 输出 address_1a123b321c456xyz
        print(firstInput.content.getSomeString) // 输出 0123456789
    }
} catch {
    print("解码失败: \(error.localizedDescription)")
}

注意事项

  • 该实现依赖JSON数组的元素顺序固定,若接口后续调整数组索引顺序,需要对应调整解码顺序
  • 若getSomeObjectArray的结构暂时不明确,可临时将其声明为[String: AnyCodable](需要引入第三方AnyCodable实现),更推荐明确接口结构后定义对应的Codable结构体
  • 如果你只需要解析JSON(不需要把模型转回JSON),可以只让MixedData遵循Decodable协议,省略encode方法的实现

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 07:15:06