2016-03-23 15 views
0

私は基本的には「Person」クラスではないxObjectクラスを持っています。そのクラス全体を.jsonファイルにシリアル化し、そのファイルを読み込んでファイルから変数を抽出できるようにしたいそれらの変数をクラスの名前にリンクします。例えばのでC++クラスをjsonにシリアル化して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"

私はXMLシリアル化とJavaで似た何かをやった、それはかなりまっすぐ進むだったが、C++ではこれを行うことは非常に簡単ではないようだ

、と私は」比較的新しいC++です。

答えて

2

イントロスペクション/リフレクションがないため、ストリームにメンバー変数を明示的に書き込まずにクラスを自動的にシリアル化することはできません。同じ理由で、シリアライズされたクラス名は取得できません。

解決策は、必要なメンバー変数をシリアル化する関数をクラスに記述することです。

もちろん、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 

あなたの属性がパブリックにする必要があります。それ以外の場合は、セッター機能を追加する必要があります。

+0

それは働いた。あなたの答えにあったいくつかのタイプミスを編集し、fstreamコールのI/Oにいくつかの行を書きました。ありがとうございました。 – BlindHouse

+0

私の電話でその答えを飛行機に書きました;) – Thomas

関連する問題