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

Swift中解析动态字符串Key时模型返回空数组的问题排查与解决

解析动态Key的JSON时Value始终为空数组?

从你给出的代码和JSON示例来看,理论上你的模型应该能正确解码出value数组,但你遇到了空数组的问题,我来帮你分析可能的原因和解决办法:

可能的原因

  • 实际JSON数据不符合预期:你描述的JSON是{"6665": ["3", "1", "", "3", "1"]},但实际请求返回的JSON可能有差异——比如对应6665的数组本身是空的、JSON包含多个key且第一个key的数组为空,甚至JSON的根元素不是字典(比如是数组)。
  • 解码错误被忽略:如果JSON格式有问题(比如数组里混了非字符串类型),解码会抛出错误,但如果你的代码没有捕获这些错误,可能会在错误处理逻辑中手动创建了一个value为空的模型实例。
  • key存在隐藏字符:虽然概率很低,但如果JSON中的6665包含空格、换行等不可见字符,会导致dict.keys.first拿到的key和字典中的实际key不匹配,最终dict[key]返回nil,触发?? []得到空数组。

解决方案

第一步:验证模型的解码逻辑

先写一段测试代码,确认你的模型能正确解码目标JSON:

let testJsonData = """
{"6665": ["3", "1", "", "3", "1"]}
""".data(using: .utf8)!

do {
    let model = try JSONDecoder().decode(PrivaciesResponseModel.self, from: testJsonData)
    print("测试结果:ID=\(model.id ?? "nil"), Value=\(model.value)")
} catch {
    print("解码出错:\(error.localizedDescription)")
}

如果这段代码输出正确的["3", "1", "", "3", "1"],说明你的模型逻辑没问题,问题出在实际的响应数据或解码调用代码中。

第二步:检查实际响应的JSON数据

打印你要解码的原始响应数据,确认它和你预期的一致:

if let rawJsonString = String(data: yourActualResponseData, encoding: .utf8) {
    print("实际返回的JSON:\(rawJsonString)")
}

重点查看是否存在目标key、对应的数组是否非空,以及JSON结构是否正确。

第三步:正确处理解码错误

在实际解码代码中,一定要捕获并处理错误,避免忽略失败情况:

do {
    let responseModel = try JSONDecoder().decode(PrivaciesResponseModel.self, from: responseData)
    // 正常处理解码后的模型
} catch {
    print("解码失败:\(error)")
    // 这里不要随便创建空模型,而是根据业务逻辑处理错误(比如提示用户重试)
}

第四步:优化你的模型代码(可选)

因为key是从字典的keys集合中获取的,dict[key]不可能为nil,所以可以去掉多余的?? [],同时用更规范的错误处理:

struct PrivaciesResponseModel: Codable {
    typealias PrivacyID = String // 不需要设为可选,因为我们能确保拿到key
    let id: PrivacyID
    let value: [String]
    
    init(from decoder: Decoder) throws {
        let container = try decoder.singleValueContainer()
        let dict = try container.decode([String: [String]].self)
        
        guard let (key, value) = dict.first else {
            throw DecodingError.dataCorrupted(
                DecodingError.Context(
                    codingPath: decoder.codingPath,
                    debugDescription: "JSON字典为空,未找到任何key-value对"
                )
            )
        }
        
        self.id = key
        self.value = value
    }
}

这里直接用dict.first获取key和value的元组,代码更简洁,同时使用系统的DecodingError,更符合Codable的设计规范。

内容的提问来源于stack exchange,提问作者Raghad.so

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 00:27:46