如何解决Vapor接收响应时output属性格式不一致的解码问题?
解决Swift中JSON output字段多格式解码问题
针对JSON响应中output字段同时存在数组格式和字符串格式的情况,可以通过自定义Codable的解码逻辑来兼容两种格式,以下是具体实现方案:
实现步骤
1. 定义辅助结构体解析数组元素
首先定义一个辅助结构体,用来解析数组格式中嵌套的file字段:
struct OutputFile: Codable { let file: String }
2. 自定义主结构体的解码逻辑
修改ReplicateModelData结构体,自定义init(from decoder:)方法,依次尝试两种格式的解码:
struct ReplicateModelData: Codable { let output: String? // 定义编码键 enum CodingKeys: String, CodingKey { case output } init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) // 优先尝试解码为数组格式 if let outputArray = try? container.decode([OutputFile].self, forKey: .output) { // 取数组第一个元素的file值(需处理多元素可调整逻辑) output = outputArray.first?.file } // 数组解码失败则尝试解码为字符串格式 else if let outputString = try? container.decode(String.self, forKey: .output) { output = outputString } // 两种格式都不匹配时,将output设为nil(也可按需抛出解码错误) else { output = nil // 若需抛出错误,可取消注释以下代码 // throw DecodingError.dataCorruptedError( // forKey: .output, // in: container, // debugDescription: "Unsupported output format" // ) } } }
代码说明
- 利用
try?尝试两种解码方式,避免单次解码失败直接中断流程 - 数组格式解码后默认取第一个元素的
file值,若业务需处理多元素场景,可将output类型改为[String]?并调整逻辑 - 若两种格式均不匹配,可选择将
output设为nil,或主动抛出错误提示格式异常
解码调用
保持原有的解码调用即可,现在两种格式的JSON都能正常解析:
try response.content.decode(ReplicateModelData.self)
内容的提问来源于stack exchange,提问作者Jinzhengxuan
相关产品推荐
相关产品推荐

