如何将C++类序列化为JSON并解析JSON文件?

3

我有一个 xObject 类,它基本上是一个简单的“人员”类,我想能够将整个类序列化为 .json 文件,然后读取该文件以便能够从文件中提取变量并将这些变量链接到类的名称。

例如:

xObject 类代码:

class xObject{
    string name;
    string lastname;
    int age;

    public:
        string getName(){
            return name;
        }
        string getLastname(){
            return lastname;
        }
        int getAge(){
            return age;
        }
}

然后我创建了一个带有一些属性的对象。

int main(){

    xObject homer;
    homer.name = "Homer";
    homer.lastname = "Simpson";
    homer.age = 30;

    //SERIALIZATION OF HOMER.
    homer.serialExport("File.json")

    return 0;
}

现在,我的File.json应该是这样的:
{"homer" :
    {"name" : "Homer"
     "lastname" : "Simpson"
     "age" : 30
    }
}

然后,我希望能够从文件中读取数据,类似于以下方式提取数据:
int main(){

    xObject bart;
    bart.name = "Bart";
    //ACTUAL USE OF THE .JSON FILE HERE
    myFile = ("File.json");
    bart.lastname = Deserializer(myFile).getLastname(); //It is supossed to assign "Simpson" 
                                                        //to the lastname reading from the serialized 
                                                        //homer class file described above.
    bart.age = Deserializer(myFile).getAge() - 20; //Sets homer's age minus 20 years.

    return 0;
}    

那么,我该如何在C++上实现呢?(接受库的实现)

我应该如何检索已序列化的类名?

例如,Deserialize(myFile).getClassName() 应该返回 "homer"

我之前在Java中使用XML序列化做过类似的事情,很简单明了,但是在C++中似乎并不容易,而且我对C++相对较新。

1个回答

4
在c++中,没有内省/反射机制,因此您不能自动序列化一个类而不在流中明确地写出成员变量。出于同样的原因,您无法检索已序列化的类名。
因此,解决方案是在您的类中编写一个函数,该函数序列化您想要的成员变量。
当然,您不会重新发明轮子以将文件格式化为json。您可以使用:https://github.com/open-source-parsers/jsoncpp
例如,您可以编写:
Json::Value root;
root["homer"]["name"]="Homer";
root["homer"]["lastname"]="Simpson";
//etc

ofstream file;
file.open("File.json"); 
file << root;           
file.close();

然而,对于读取操作,您可以按照自己的意愿进行:
Json::Value root2;
ifstream file2;
file2.open("File.json");
file2 >> root2;
file2.close();

xObject homer;
homer.lastname = root2["homer"]["lastname"].toStyledString();
//etc

当然,你的属性必须是公开的。否则你需要添加一个设置函数。

1
好的,我已经修复了你回答中的一些拼写错误,并在fstream调用的I/O上写入了几行额外的代码。谢谢你。 - BlindHouse
1
我用手机在飞机上写了那个答案 ;) - El pupi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接