// Serialize example | |
// This example shows writing JSON string with writer directly. | |
#include "rapidjson/prettywriter.h" // for stringify JSON | |
#include <cstdio> | |
#include <string> | |
#include <vector> | |
using namespace rapidjson; | |
class Person { | |
public: | |
Person(const std::string& name, unsigned age) : name_(name), age_(age) {} | |
virtual ~Person(); | |
protected: | |
template <typename Writer> | |
void Serialize(Writer& writer) const { | |
// This base class just write out name-value pairs, without wrapping within an object. | |
writer.String("name"); | |
#ifdef RAPIDJSON_HAS_STDSTRING | |
writer.String(name_); | |
#else | |
writer.String(name_.c_str(), (SizeType)name_.length()); // Supplying length of string is faster. | |
#endif | |
writer.String("age"); | |
writer.Uint(age_); | |
} | |
private: | |
std::string name_; | |
unsigned age_; | |
}; | |
Person::~Person() { | |
} | |
class Education { | |
public: | |
Education(const std::string& school, double GPA) : school_(school), GPA_(GPA) {} | |
template <typename Writer> | |
void Serialize(Writer& writer) const { | |
writer.StartObject(); | |
writer.String("school"); | |
#ifdef RAPIDJSON_HAS_STDSTRING | |
writer.String(school_); | |
#else | |
writer.String(school_.c_str(), (SizeType)school_.length()); | |
#endif | |
writer.String("GPA"); | |
writer.Double(GPA_); | |
writer.EndObject(); | |
} | |
private: | |
std::string school_; | |
double GPA_; | |
}; | |
class Dependent : public Person { | |
public: | |
Dependent(const std::string& name, unsigned age, Education* education = 0) : Person(name, age), education_(education) {} | |
Dependent(const Dependent& rhs) : Person(rhs), education_(0) { education_ = (rhs.education_ == 0) ? 0 : new Education(*rhs.education_); } | |
virtual ~Dependent(); | |
Dependent& operator=(const Dependent& rhs) { | |
if (this == &rhs) | |
return *this; | |
delete education_; | |
education_ = (rhs.education_ == 0) ? 0 : new Education(*rhs.education_); | |
return *this; | |
} | |
template <typename Writer> | |
void Serialize(Writer& writer) const { | |
writer.StartObject(); | |
Person::Serialize(writer); | |
writer.String("education"); | |
if (education_) | |
education_->Serialize(writer); | |
else | |
writer.Null(); | |
writer.EndObject(); | |
} | |
private: | |
Education *education_; | |
}; | |
Dependent::~Dependent() { | |
delete education_; | |
} | |
class Employee : public Person { | |
public: | |
Employee(const std::string& name, unsigned age, bool married) : Person(name, age), dependents_(), married_(married) {} | |
virtual ~Employee(); | |
void AddDependent(const Dependent& dependent) { | |
dependents_.push_back(dependent); | |
} | |
template <typename Writer> | |
void Serialize(Writer& writer) const { | |
writer.StartObject(); | |
Person::Serialize(writer); | |
writer.String("married"); | |
writer.Bool(married_); | |
writer.String(("dependents")); | |
writer.StartArray(); | |
for (std::vector<Dependent>::const_iterator dependentItr = dependents_.begin(); dependentItr != dependents_.end(); ++dependentItr) | |
dependentItr->Serialize(writer); | |
writer.EndArray(); | |
writer.EndObject(); | |
} | |
private: | |
std::vector<Dependent> dependents_; | |
bool married_; | |
}; | |
Employee::~Employee() { | |
} | |
int main(int, char*[]) { | |
std::vector<Employee> employees; | |
employees.push_back(Employee("Milo YIP", 34, true)); | |
employees.back().AddDependent(Dependent("Lua YIP", 3, new Education("Happy Kindergarten", 3.5))); | |
employees.back().AddDependent(Dependent("Mio YIP", 1)); | |
employees.push_back(Employee("Percy TSE", 30, false)); | |
StringBuffer sb; | |
PrettyWriter<StringBuffer> writer(sb); | |
writer.StartArray(); | |
for (std::vector<Employee>::const_iterator employeeItr = employees.begin(); employeeItr != employees.end(); ++employeeItr) | |
employeeItr->Serialize(writer); | |
writer.EndArray(); | |
puts(sb.GetString()); | |
return 0; | |
} |