Я хочу десериализовать JSON-файл для объекта (класса) с помощью C++. Я посмотрел на библиотеку rapidjson, и каждый класс имел метод десериализации с параметром root как параметр, поэтому он может десериализоваться. Это выглядит так:JSON deserialization C++
void PoliceOfficer::Deserialize(rapidjson::Value& root)
{
if (root.IsObject())
{
if (root.HasMember("name"))
{
if (root["name"].IsString())
{
name = root["name"].GetString();
}
}
if (root.HasMember("maxHealth"))
{
if (root["maxHealth"].IsNumber())
{
maxHealth = (float)root["maxHealth"].GetDouble();
}
}
if (root.HasMember("skills"))
{
rapidjson::Value& skills = root["skills"];
if (skills.IsArray())
{
for (rapidjson::SizeType i = 0; i < skills.Size(); i++)
{
Skill tempSkill;
tempSkill.Deserialize(skills[i]);
m_skills.push_back(tempSkill);
}
}
}
}
}
Но это похоже на большую работу. Вам придется реализовать этот метод во всех классах, которые вы хотите десериализовать сами. Так что мне было интересно, есть ли способ сделать это автоматически, что-то вроде следующей строки кода (Json.NET):
Movie m = JsonConvert.DeserializeObject<Movie>(json);
, так что я не должен писать метод десериализации для всех классов. Я так делаю это единственный способ сделать это? Я использую quickjson, но я открыт для проверки другой библиотеки.
Я надеюсь, что этот вопрос имеет смысл :)
Спасибо заранее!
C++ не имеет самоанализ, так что вы не можете напрямую сделать это, но вы можете посмотреть на [ boost hana] (http://ldionne.com/hana/index.html#tutorial-introspection-json). – Jarod42
В принципе нет, извините –
Я бы настоятельно предложил не строить его в ваш класс. Это делает ваши классы грязными и ваши кодовые спагетти. Вместо этого используйте бесплатные функции. Также ваш код очень многословный; рефакторируйте его так, чтобы это была всего одна строка для каждого члена, который вы читаете. –