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

如何解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 12:25:04