首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何忽略编码中的零json值

如何忽略编码中的零json值
EN

Stack Overflow用户
提问于 2019-03-28 08:28:27
回答 2查看 1.3K关注 0票数 3

我现在拿到了Auto-RenewableNon-Renewable的收据。但是Non-Renewable没有带着expires_date json密钥回来。我怎么能忽视这个。我试图避免让expires_date成为一个可选的选项。当我可选的时候,苹果会发回一个回复。有没有办法不让expires_date成为可选的,就可以解码json。

代码语言:javascript
复制
struct Receipt: Codable {

    let expiresDate: String

    private enum CodingKeys: String, CodingKey {
        case expiresDate = "expires_date"
    }
}

现在我可以

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-28 08:52:32

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

代码语言:javascript
复制
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
    }        
}

注意:

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

用法示例:

代码语言:javascript
复制
let data = """
[{
  "expires_date": "2019"
},
{

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

do {
    let obj = try JSONDecoder().decode([Receipt].self, from: data)
    print(obj)
}
catch {
    print(error)
}
票数 5
EN

Stack Overflow用户

发布于 2019-03-28 08:42:15

手动解码如何:

代码语言:javascript
复制
struct Receipt: Codable {

    let expiresDate: String

    private enum CodingKeys: String, CodingKey {
        case expiresDate = "expires_date"
    }

    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        if let expDate = try? values.decode(String.self, forKey: .expiresDate) {
            self.expiresDate = expDate
        } else {
            self.expiresDate = "sth"
        }
    }
}

示例:

代码语言:javascript
复制
struct Receipt: Codable {

    let expiresDate: String
    let b: String

    private enum CodingKeys: String, CodingKey {
        case expiresDate = "expires_date"
        case b = "b"
    }

    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        if let expDate = try? values.decode(String.self, forKey: .expiresDate) {
            self.expiresDate = expDate
        } else {
            self.expiresDate = "sth"
        }
        b = try values.decode(String.self, forKey: .b)
    }
}


let a = """
{
    "b": "asdf"
}
""".data(using: .utf8)!
let myStruct = try JSONDecoder().decode(Receipt.self, from: a)
print(myStruct) //Receipt(expiresDate: "sth", b: "asdf")
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55393051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档