Как отобразить динамический JSON на объект? - PullRequest
0 голосов
/ 22 мая 2018

Как вы создаете объекты, если заранее не знаете всех их свойств?

Я хочу создать фреймворк, который работает с 2 файлами:

  1. Входной файл JSON:Ваши объекты JSON в файле JSON.
  2. Отображение файла JSON: сопоставление этих объектов JSON в файле JSON.

Предположим, вы получили следующий input JSON Person:

{
    "name": "John Snow",
    "age": 18,
    "country_code": "UK"
}

И вы получаете другой динамический файл JSON mapping , который указывает, как некоторые свойства должны отображаться из 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 может быть полностью изменен отображением.Это означает, что вы не можете заранее определить свои модели.

Как вы решаете эту проблему в общем виде?Я не прошу код, но мне любопытно теоретическое решение о том, как решить эту проблему.В настоящее время я создаю обертки для словарей, но это почти то же самое, что создавать предопределенные модели, которые убирают всю концепцию универсальной структуры.

Возможно, мне нужно определить какой-то протокол / интерфейс вместо реальных реализаций?Или работа с дженериками?

...