2016-03-23 23 views
0

Temelde önemsiz bir "Kişi" Sınıfı olan bir xObject Sınıfına sahibim ve tüm sınıfı bir .json dosyasına serileştirmek ve dosyadan değişkenleri ayıklamak için bu dosyayı okumak istiyorum. ve bu değişkenleri sınıfa bağlar.C++ Sınıfı json'a serileştirmek ve json dosyasını ayrıştırmak nasıl?

örneğin Yani

:

XObject Sınıf Kodu:

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

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

Daha sonra da bazı özelliklere sahip bir nesne oluşturun.

{"homer" : 
    {"name" : "Homer" 
    "lastname" : "Simpson" 
    "age" : 30 
    } 
} 

ve sonra, böyle bir şey ile ondan veri ayıklamak için dosyadan okumak mümkün istiyorum:

int main(){ 

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

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

    return 0; 
} 

Yani şimdi, benim File.json gibi görünmelidir

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

Peki, bunu C++ üzerinde nasıl yapabilirim? (Kütüphaneler uygulaması kabul edilir)

Seri hale getirilmiş sınıf adını nasıl alabilirim?

Örneğin Deserialize(myFile).getClassName() için dönmelidir "homer"

Ben XML seri ile java benzer bir şey yaptık ve oldukça yalındır, ancak C++ bunu yapmak çok kolay değil gibi görünüyor

, bense nispeten yeni C++.

cevap

2

C++'da iç gözlem/yansıma bulunmadığından, üye değişkenlerinizi akışınıza açıkça yazmadan bir sınıfı otomatik olarak serileştiremezsiniz. Aynı nedenden dolayı, serileştirilmiş sınıf adını alamıyorsunuz.

Bu nedenle çözüm, sınıfınızda istediğiniz üye değişkenlerini serileştiren bir işlev yazmaktır.

Elbette dosyanızı json olarak biçimlendirmek için tekerleği yeniden icat etmeyeceksiniz. Kullanabileceğiniz: https://github.com/open-source-parsers/jsoncpp.

Örneğin yazabilirsiniz: Eğer istediği gibi

Json::Value root; 
root["homer"]["name"]="Homer"; 
root["homer"]["lastname"]="Simpson"; 
//etc 

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

Ancak okuma, yapabileceğiniz: Elbette

Json::Value root2; 
ifstream file2; 
file2.open("File.json"); 
file2 >> root2; 
file2.close(); 

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

senin nitelik kamu olmak zorundadır. Aksi takdirde bir ayarlayıcı fonksiyonu eklemeniz gerekir.

+0

Çalıştı. Cevabınızdaki bazı yazım hatalarını düzenledim ve fstream çağrılarının bir kaç satırı daha yazdım. Teşekkür ederim. – BlindHouse

+0

Bu cevabı telefonumla uçakta yazdım;) – Thomas