如果事先你不知道它的所有属性,你如何创建对象?
我想创建一个可以处理2个文件的框架:
假设您收到以下输入 JSON Person
:
{
"name": "John Snow",
"age": 18,
"country_code": "UK"
}
您还会收到另一个动态JSON 映射文件,该文件指定了如何从Persons
JSON映射某些属性:
{
"source_type": "country_code",
"source_value": "UK",
"destination_type": "country",
"destination_value": "United Kingdom"
}
在这种情况下,我想用正确的值将密钥“country_code”更改为“country”。必须将人员JSON更改为:
{
"name": "John Snow",
"age": 18,
"country": "United Kingdom",
}
我无法创建符合Codable的结构,因为可以从映射更改JSON的键:
// This won't work.
struct Person: Codable {
var name: String // can be deleted
var age: Int // can be changed to dateOfBirth
var country: String // can be changed to country_code or national_code
}
映射也可能要求组合某些键来创建新属性:
{
"source_type": "name|age",
"source_value": "John Snow|18",
"destination_type": "nameAge",
"destination_value": "John Snow is 18 years old."
}
这会产生以下JSON对象:
{
"name": "John Snow",
"age": 18,
"country": "United Kingdom",
"nameAge": "John Snow is 18 years old."
}
正如您所看到的,映射可以完全改变输入JSON。这意味着您无法预定义模型。
您如何以通用方式解决此问题?我不是要求代码,但我对如何解决这个问题的理论解决方案感到好奇。目前我创建了关于字典的包装器,但这几乎与创建预定义模型相同,后者消除了通用框架的整个概念。
也许我必须定义一些协议/接口而不是实际的实现?或者与Generics合作?