如何将动态JSON映射到对象?

时间:2018-05-22 09:55:13

标签: json swift mapping

如果事先你不知道它的所有属性,你如何创建对象?

我想创建一个可以处理2个文件的框架:

  1. 输入JSON文件:JSON文件中的JSON对象。
  2. 映射JSON文件:JSON文件中这些JSON对象的映射。
  3. 假设您收到以下输入 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合作?

0 个答案:

没有答案