JSON反序列化C++

JSON deserialization C++

本文关键字:C++ 反序列化 JSON      更新时间:2023-10-16

我想使用C++将JSON文件反序列化为对象(类)。我研究过rapidjson库,并使每个类都有一个以根为参数的反序列化方法,这样它就可以反序列化自己。它看起来像这样:

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);

所以我不必为所有类编写反序列化方法。我做这件事的方式是唯一的方法吗?我正在使用rapidjson,但我愿意尝试另一个库。

我希望这个问题有意义:)

提前谢谢!

要处理像这样的问题,您需要一个可能的解决方案,将所有信息集中在一个函数中,在该函数中,您可以生成映射结构字段<--->json/xml/ini文件中的条目。类似这样的东西:

struct abc_t
{
    int a ;
    string b ;
} ;
void serialize(serializer_t &serializer, abc_t &abc)
{
    serializer.exx(abc.a, "abc") ;
    serializer.exx(abc.b, "b") ;
}

问题是如何编写这个序列化程序。解决方案可以是这样一个抽象类:

class serializer_t
{
public:
    virtual ~serializer_t(void) {}
    virtual void exx(int &value, const char *tag) = 0 ;
    virtual void exx(string &value, const char *tag) = 0 ;
} ;

然后将有两个派生类,一个实现写入的serializerwritert和一个实现读取的serializer_readert。

另一种可能性是静态多态性:这意味着将原始void serialize(serializer_t &serializer, abc_t &abc)作为模板函数。如果您有一个复合对象,那么您需要将此策略应用于每个子对象。

看看boost.serialization:你会发现关于这个任务中涉及的所有权衡的深入讨论