当前位置: 首页 > 面试题库 >

在动态类型/对象上使用Codable

司空和悌
2023-03-14
问题内容

嗨,我将以下结构嵌套在一个更大的结构中,该结构是通过api调用返回的,但是我无法对这部分进行编码/解码。我遇到的问题是customKey和customValue都是动态的。

{
    "current" : "a value"
    "hash" : "some value"
    "values": {
        "customkey": "customValue",
        "customKey": "customValue"
    }
}

我尝试了类似的操作,var values: [String:String]但是显然不起作用,因为它实际上不是的数组[String:String]


问题答案:

由于您将我的答案链接到另一个问题,因此我将扩展该问题以回答您的问题。

事实是,如果您知道要查找的位置,那么所有键在运行时都是已知的:

struct GenericCodingKeys: CodingKey {
    var intValue: Int?
    var stringValue: String

    init?(intValue: Int) { self.intValue = intValue; self.stringValue = "\(intValue)" }
    init?(stringValue: String) { self.stringValue = stringValue }

    static func makeKey(name: String) -> GenericCodingKeys {
        return GenericCodingKeys(stringValue: name)!
    }
}


struct MyModel: Decodable {
    var current: String
    var hash: String
    var values: [String: String]

    private enum CodingKeys: String, CodingKey {
        case current
        case hash
        case values
    }

    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        current = try container.decode(String.self, forKey: .current)
        hash = try container.decode(String.self, forKey: .hash)

        values = [String: String]()
        let subContainer = try container.nestedContainer(keyedBy: GenericCodingKeys.self, forKey: .values)
        for key in subContainer.allKeys {
            values[key.stringValue] = try subContainer.decode(String.self, forKey: key)
        }
    }
}

用法:

let jsonData = """
{
    "current": "a value",
    "hash": "a value",
    "values": {
        "key1": "customValue",
        "key2": "customValue"
    }
}
""".data(using: .utf8)!

let model = try JSONDecoder().decode(MyModel.self, from: jsonData)


 类似资料:
  • 问题内容: 可能是之前问过的一个问题,但是像往常一样,第二个提到“通用”一词时,您会得到一千个答案,以解释类型擦除。我很早以前就经历了这一阶段,现在对泛型及其使用有了很多了解,但是这种情况稍微有些微妙。 我有一个表示电子表格中数据单元格的容器,该容器实际上以两种格式存储数据:既作为显示字符串,也取决于数据(作为对象存储)为另一种格式。该单元格还包含一个在类型之间转换的转换器,并且还对类型进行有效性

  • 我正在尝试为鼠标拖动的事件创建一个EventHandler。我将使用同一个处理程序对多个ImageView执行相同的操作。这就是我所做的。 但显然,我不能使用toFront或setTranslate方法或任何我用于ImageView的方法,因为e.getSource返回一个对象,而这些是对象类型无法使用的ImageView方法。显然,我也不能简单地将其转换为ImageView 我可以简单地使用内部

  • 例如,类的ViewBag属性,我们可以动态地获取/设置值,并向该对象添加任意数量的附加字段或属性,这很酷。我想在其他类型的应用程序中使用类似的东西,除了MVC应用程序和类之外。当我试图创建动态对象并设置它的属性时,如下所示: 我有,带有message属性或索引器'<>f__anonymoustype0.a'不能赋值--它在第2行中是只读的。我也认为这不是我想要的。也许有什么课可以让我做一些类似的事

  • 我正在制作一个工具来动态显示运行java类的源代码。我需要一个工具来帮助我从到源代码的进行动态反编译。我知道一些反编译工具,如Jad,DJ反编译程序可以反编译一个.class文件,但我希望一个工具可以: 我需要这样的反编译工具,有人知道吗?谢谢

  • 本文向大家介绍c#动态类型,及动态对象的创建,合并2个对象,map实例,包括了c#动态类型,及动态对象的创建,合并2个对象,map实例的使用技巧和注意事项,需要的朋友参考一下 经常会遇到这样的情况,我们在响应客户端请求的数据的时候需要对数据进行处理,比如数据库中的数据是int型,它可能表示某个枚举,或者其它的逻辑意义(数据库这样的设计可能是从数据安全性、存储量上等角度考虑),但是客户端显示的时候需

  • 本文向大家介绍详解C# 匿名对象(匿名类型)、var、动态类型 dynamic,包括了详解C# 匿名对象(匿名类型)、var、动态类型 dynamic的使用技巧和注意事项,需要的朋友参考一下 随着C#的发展,该语言内容不断丰富,开发变得更加方便快捷,C# 的锋利尽显无疑。C# 语言从诞生起就是强类型语言,这一性质到今天不曾改变,我想以后也不会变。既然是强类型语言,那编写任一程序均要求满足下面的基本