Как преобразовать изменяющийся JSON объект? С++

Проблема в том, что мне на вход программы приходит, например, такой JSON-объект:

{
  "objectName":"Clock",
  "text":"228:1337",
  "child":
  {
    "objectName":"Timer",
    "milliseconds":"1212121212"
  }
}

Я хочу преобразовать этот JSON в 2 объекта: Clock и ему задать внутреннюю переменную-член Timer:

class Clock 
{
private:
  Timer m_timer;
}

Проблема в том, что в этом JSON может и не быть поля child. Как тогда сконструировать объект Clock, если Timer не из чего конструировать? Вариант с инициализацией по умолчанию кажется сомнительным, потому что у Timer, например, есть значение milliseconds. Если мы сконструируем в случае отсутствия в JSON поля child объект Timer по умолчанию, то не сможем понять, milliseconds равны нулю или просто объект отсутствовал.

Сейчас я рассматриваю вот такой вариант решения проблемы:

class Clock 
{
private:
  std::optional<Timer> m_timer;
}

Но это решение мне не кажется правильным и красивым, скорее на костыль похоже. Тем более, если в классе много полей, которые могли бы отсутствовать. Еще я рассматриваю вариант сохранения в классе не самого объекта Timer, а указателя на него и указания nullptr в случае, когда объекта в JSON не оказалось. Но в таком случае для цепочки объектов придется каждый раз проверять указатель на nullptr, что делает невозможным использование таких конструкций:clock->timer->milliseconds->int_value()

Идеальным решением было бы использование шаблонов, чтобы некоторые поля отсутствовали у объекта в случае, если их нет в JSON, но JSON считывается в рантайме, так что этот способ тоже не подходит.

Какой вариант лучше всего и есть ли какие-то более спортивные варианты решения проблемы отсутствия объекта в JSON?


Ответы (0 шт):