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
相关产品推荐
相关产品推荐

