Как вы создаете объекты, если заранее не знаете всех их свойств?
Я хочу создать фреймворк, который работает с 2 файлами:
- Входной файл JSON:Ваши объекты JSON в файле JSON.
- Отображение файла 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 может быть полностью изменен отображением.Это означает, что вы не можете заранее определить свои модели.
Как вы решаете эту проблему в общем виде?Я не прошу код, но мне любопытно теоретическое решение о том, как решить эту проблему.В настоящее время я создаю обертки для словарей, но это почти то же самое, что создавать предопределенные модели, которые убирают всю концепцию универсальной структуры.
Возможно, мне нужно определить какой-то протокол / интерфейс вместо реальных реализаций?Или работа с дженериками?