如何忽略可编码中的 nil json 值

man*_*112 3 json ios swift codable

我目前收到了收据Auto-RenewableNon-Renewable。但是Non-Renewable没有返回expires_datejson 密钥。我怎么能忽略这一点。我试图避免做expires_date一个可选的。当我将其设为可选时,Apple 会返回响应。有没有办法可以在不进行expires_date可选的情况下解码 json 。

struct Receipt: Codable {

    let expiresDate: String

    private enum CodingKeys: String, CodingKey {
        case expiresDate = "expires_date"
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我可以得到

“没有与键 CodingKeys(stringValue: \"expires_date\", intValue: nil) (\"expires_date\") 关联的值。”

sta*_*Man 5

在 nil 合并为默认值之前,您必须实现自己的init(from: Decoder)和使用decodeIfPresent(_:forKey:)

struct Receipt: Codable {
    let expiresDate: String
    
    enum CodingKeys: String, CodingKey {
        case expiresDate = "expires_date"
    }
    
    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)        
        self.expiresDate = try values.decodeIfPresent(String.self, forKey: .expiresDate)
            ?? "1970" //Default value
    }        
}
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 如果Receipt有更多的键值对,那么您也必须手动解码它们。

用法示例:

let data = """
[{
  "expires_date": "2019"
},
{

}]
""".data(using: .utf8)!

do {
    let obj = try JSONDecoder().decode([Receipt].self, from: data)
    print(obj)
}
catch {
    print(error)
}
Run Code Online (Sandbox Code Playgroud)