目录
1.介绍2.jsoncpp3.使用1.main.cc2.序列化3.反序列化
1.介绍
json
是一种数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据json
数据类型:对象、数组、字符串、数字 对象:使用{}
括起来的表示一个对象数组:使用[]
括起来的表示一个数组字符串:使用""
括起来的表示一个字符串数字:包括整形和浮点型,直接使用 2.jsoncpp
jsoncpp
库用于实现json
格式的序列化和反序列化,完成将多个数据对象组织成为格式字符串解析得到多个数据对象的功能主要借助三个类以及其对应的少量成员函数完成:// Json数据对象类 -> 用于进行中间数据存储class Json::Value{// Value重载了[]和=,因此所有的赋值和获取数据都可以通过[]实现Value &operator=(const Value &other);// 简单的方式完成 val["姓名"] = "SnowK";Value& operator[](const std::string& key);Value& operator[](const char* key);// 移除元素Value removeMember(const char* key);// val["成绩"][0]const Value& operator[](ArrayIndex index) const; // 添加数组元素val["成绩"].append(88); Value& append(const Value& value);// 获取数组元素个数 val["成绩"].size();ArrayIndex size() const;// 转string string name = val["name"].asString();std::string asString() const;// 转char* char *name = val["name"].asCString();const char* asCString() const;// 转int int age = val["age"].asInt();int asInt() const; // 转floatfloat asFloat() const;// 转 boolbool asBool() const;};//json序列化类,低版本用这个更简单class JSON_API Writer {virtual std::string write(const Value& root) = 0;}class JSON_API FastWriter : public Writer {virtual std::string write(const Value& root);}class JSON_API StyledWriter : public Writer {virtual std::string write(const Value& root);}//json 序列化类,高版本推荐,如果用低版本的接口可能会有警告class JSON_API StreamWriter {virtual int write(Value const& root, std::ostream* sout) = 0;}class JSON_API StreamWriterBuilder : public StreamWriter::Factory {virtual StreamWriter* newStreamWriter() const;}// json反序列化类,低版本用起来更简单class JSON_API Reader {bool parse(const std::string& document, Value& root, bool collectComments = true);}// json反序列化类,高版本更推荐class JSON_API CharReader {virtual bool parse(char const* beginDoc, char const* endDoc, Value* root, std::string* errs) = 0;}class JSON_API CharReaderBuilder : public CharReader::Factory {virtual CharReader* newCharReader() const;}
3.使用
1.main.cc
int main(){ char name[] = "SnowK"; int age = 18; float score[3] = {100, 99, 98}; Json::Value stu; stu["Name"] = name; stu["Age"] = age; stu["Score"].append(score[0]); stu["Score"].append(score[1]); stu["Score"].append(score[2]); std::string str; if(Serialize(stu, str) == false) { return -1; } std::cout << str << std::endl; std::cout << "-------------------------------" << std::endl; Json::Value val; if(UnSerialize(str, val) == false) { return -1; } std::cout << val["Name"].asString() << std::endl; std::cout << val["Age"].asInt() << std::endl; for (int i = 0; i < val["Score"].size(); i++) { std::cout << val["Score"][i].asInt() << std::endl; } return 0;}
2.序列化
bool Serialize(const Json::Value &val, std::string &dest){ // 由Json::StreamWriterBuilder生产出Json::StreamWriter Json::StreamWriterBuilder swb; std::unique_ptr<Json::StreamWriter> sw(swb.newStreamWriter()); // 通过Json::StreamWrite的write()进行序列化 std::stringstream ss; if (sw->write(val, &ss) != 0) { std::cout << "Json序列化失败" << std::endl; return false; } dest = ss.str(); return true;}
3.反序列化
bool UnSerialize(const std::string &src, Json::Value &val){ Json::CharReaderBuilder crb; std::unique_ptr<Json::CharReader> cr(crb.newCharReader()); std::string err; if (cr->parse(src.c_str(), src.c_str() + src.size(), &val, &err) == false) { std::cout << "json反序列化失败: " << err << std::endl; return false; } return true;}