有没有办法用 Decodable 忽略某些键,只提取它们的值?

Posted

技术标签:

【中文标题】有没有办法用 Decodable 忽略某些键,只提取它们的值?【英文标题】:Is there a way to ignore certain keys with Decodable just extract their values? 【发布时间】:2020-11-01 13:48:55 【问题描述】:

我有以下 JSON 示例

    let json = """
    
        "str": [
            
            "abv": "4.4",
            "weight": "4.1",
                "volume": "5.0"
        
        ]
    
    """.data(using: .utf8)!

还有以下Decoable 结构体

    struct Outer: Decodable 
        let stri: [Garten]
        
        enum CodingKeys: String, CodingKey 
            case stri = "str"
        
        
        
        struct Garten: Decodable 
            let alcoholByVol: String
            let weight: String
            let vol: String
            
            enum CodingKeys: String, CodingKey 
                case alcoholByVol = "abv"
                case weight = "weight"
                case vol = "volume"
            
        
    

我想知道是否有任何方法可以避免外部struct。它基本上只存在于解码内部数组的那个键。

这就是我目前的解码方式

let attrs = try! decoder.decode(Outer.self, from: json)

但我很好奇是否有类似的东西

let attrs = try! decoder.decode([[String: [Outer]].self, from: json)

【问题讨论】:

是的,你可以,但有一个 [ 太多了 您还需要将Outer 替换为Outer.Garten,例如:let attrs = try! decoder.decode([String: [Outer.Garten]].self, from: json) 【参考方案1】:

您可以完全删除Outer 并解码[String: [Garten]].self。然后获取与"str"键关联的值:

let attrsDict = try! decoder.decode([String: [Garten]].self, from: json)
let attrs = attrsDict["str"]!

您可以将其包装在一个函数中:

func decodeNestedObject<T: Codable>(_ type: T.Type, key: String, 
    from data: Data, using decoder: JSONDecoder = JSONDecoder()) throws -> T 
    try decoder.decode([String: T].self, from: data)[key]!

用法:

let attrs = try decodeNestedObject([Garten].self, key: "str", from: data)

【讨论】:

谢谢!我确定我之前尝试过这个建议,但由于某种原因它现在可以工作了。非常感谢您的帮助。

以上是关于有没有办法用 Decodable 忽略某些键,只提取它们的值?的主要内容,如果未能解决你的问题,请参考以下文章

更新某些行时忽略唯一键(mariaDB)

有没有办法忽略映射字符过滤器?

切换分支时如何忽略某些文件中的某些更改?

是否可以告诉 Scintilla 忽略某些击键并将它们传递给父窗口?

强制编译器忽略程序中的某些行

有没有办法完全忽略特定项目包中的所有 MyPy 错误?