1 // Serialize example
2 // This example shows writing JSON string with writer directly.
3
4 #include "rapidjson/prettywriter.h" // for stringify JSON
5 #include <cstdio>
6 #include <string>
7 #include <vector>
8
9 using namespace rapidjson;
10
11 class Person {
12 public:
Person(const std::string & name,unsigned age)13 Person(const std::string& name, unsigned age) : name_(name), age_(age) {}
14 virtual ~Person();
15
16 protected:
17 template <typename Writer>
Serialize(Writer & writer) const18 void Serialize(Writer& writer) const {
19 // This base class just write out name-value pairs, without wrapping within an object.
20 writer.String("name");
21 #ifdef RAPIDJSON_HAS_STDSTRING
22 writer.String(name_);
23 #else
24 writer.String(name_.c_str(), (SizeType)name_.length()); // Supplying length of string is faster.
25 #endif
26 writer.String("age");
27 writer.Uint(age_);
28 }
29
30 private:
31 std::string name_;
32 unsigned age_;
33 };
34
~Person()35 Person::~Person() {
36 }
37
38 class Education {
39 public:
Education(const std::string & school,double GPA)40 Education(const std::string& school, double GPA) : school_(school), GPA_(GPA) {}
41
42 template <typename Writer>
Serialize(Writer & writer) const43 void Serialize(Writer& writer) const {
44 writer.StartObject();
45
46 writer.String("school");
47 #ifdef RAPIDJSON_HAS_STDSTRING
48 writer.String(school_);
49 #else
50 writer.String(school_.c_str(), (SizeType)school_.length());
51 #endif
52
53 writer.String("GPA");
54 writer.Double(GPA_);
55
56 writer.EndObject();
57 }
58
59 private:
60 std::string school_;
61 double GPA_;
62 };
63
64 class Dependent : public Person {
65 public:
Dependent(const std::string & name,unsigned age,Education * education=0)66 Dependent(const std::string& name, unsigned age, Education* education = 0) : Person(name, age), education_(education) {}
Dependent(const Dependent & rhs)67 Dependent(const Dependent& rhs) : Person(rhs), education_(0) { education_ = (rhs.education_ == 0) ? 0 : new Education(*rhs.education_); }
68 virtual ~Dependent();
69
operator =(const Dependent & rhs)70 Dependent& operator=(const Dependent& rhs) {
71 if (this == &rhs)
72 return *this;
73 delete education_;
74 education_ = (rhs.education_ == 0) ? 0 : new Education(*rhs.education_);
75 return *this;
76 }
77
78 template <typename Writer>
Serialize(Writer & writer) const79 void Serialize(Writer& writer) const {
80 writer.StartObject();
81
82 Person::Serialize(writer);
83
84 writer.String("education");
85 if (education_)
86 education_->Serialize(writer);
87 else
88 writer.Null();
89
90 writer.EndObject();
91 }
92
93 private:
94
95 Education *education_;
96 };
97
~Dependent()98 Dependent::~Dependent() {
99 delete education_;
100 }
101
102 class Employee : public Person {
103 public:
Employee(const std::string & name,unsigned age,bool married)104 Employee(const std::string& name, unsigned age, bool married) : Person(name, age), dependents_(), married_(married) {}
105 virtual ~Employee();
106
AddDependent(const Dependent & dependent)107 void AddDependent(const Dependent& dependent) {
108 dependents_.push_back(dependent);
109 }
110
111 template <typename Writer>
Serialize(Writer & writer) const112 void Serialize(Writer& writer) const {
113 writer.StartObject();
114
115 Person::Serialize(writer);
116
117 writer.String("married");
118 writer.Bool(married_);
119
120 writer.String(("dependents"));
121 writer.StartArray();
122 for (std::vector<Dependent>::const_iterator dependentItr = dependents_.begin(); dependentItr != dependents_.end(); ++dependentItr)
123 dependentItr->Serialize(writer);
124 writer.EndArray();
125
126 writer.EndObject();
127 }
128
129 private:
130 std::vector<Dependent> dependents_;
131 bool married_;
132 };
133
~Employee()134 Employee::~Employee() {
135 }
136
main(int,char * [])137 int main(int, char*[]) {
138 std::vector<Employee> employees;
139
140 employees.push_back(Employee("Milo YIP", 34, true));
141 employees.back().AddDependent(Dependent("Lua YIP", 3, new Education("Happy Kindergarten", 3.5)));
142 employees.back().AddDependent(Dependent("Mio YIP", 1));
143
144 employees.push_back(Employee("Percy TSE", 30, false));
145
146 StringBuffer sb;
147 PrettyWriter<StringBuffer> writer(sb);
148
149 writer.StartArray();
150 for (std::vector<Employee>::const_iterator employeeItr = employees.begin(); employeeItr != employees.end(); ++employeeItr)
151 employeeItr->Serialize(writer);
152 writer.EndArray();
153
154 puts(sb.GetString());
155
156 return 0;
157 }
158