Jsoncpp是一个开源项目,它是一个用于处理JSON(JavaScript Object Notation)数据的C++库。它支持将C++结构化的数据转化为JSON字符串,也支持将JSON字符串转化为结构化数据
JSON(JavaScript Object Notation)数据格式是一种轻量级的数据交换格式,它基于ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于语言的文本格式来存储和表示数据。简单说,JSON 是一种数据格式,不是一种编程语言,虽然它具有相同的语法形式,但它并不遵循 JavaScript 的语法规则。
下面是在Ubuntu中安装Jsoncpp库的指令:
Ubuntu: sudo apt install -y libjsoncpp-dev Centos: sudo yum install -y jsoncpp-devel
安装完成之后我们就可以在如下的目录中查询到头文件
下面我们就来简单使用一下这个库:下面的就是简单的样例代码,我们只需要照猫画虎的套模板够用即可
#include<iostream> #include<string> #include<jsoncpp/json/json.h> struct stu { std::string name; int age; double weight; }; int main() { struct stu xm={"小明",18,75};//结构化数据 Json::Value root;//定义存放数据对象 root["name"]=xm.name;//向对象中写入 root["age"]=xm.name; root["weight"]=xm.weight; Json::FastWriter writer;//定义输出格式对象 std::string str=writer.write(root);//write函数输出json格式字符串 std::cout<<str; return 0; }
上面就是一个最简单的演示,其中编译的时候要链接动态库(即加编译选项-ljsoncpp),最终结果是这样的:
当然除了上面的格式,我们在定义输出格式对象的时候还可以定义下面的类的对象,这样字符串的格式就会发生变化
并且对象中可以放自己
并且我们可以发现,打印格式是按名称首字母排序后打印的(a,n,s,w),而不是我代码中的赋值顺序(n,a,w,s)
下面就是给我们json格式的字符串,我们如何转化为结构化的数据,我们无法得到json格式的字符串可以用上面的代码把生成的字符串写入到文件中
struct stu { void print() { std::cout << "Debug:\nname: " << name << "age: " << age << "weight: " << weight << std::endl; } std::string name; int age; double weight; }; int main() { std::ifstream in("out.txt"); if (!in.is_open()) return 1; char buffer[1024]; in.read(buffer, sizeof(buffer)); in.close(); std::string json_str = buffer; // 把文件中的字符串读到json_str中 Json::Value root; // 定义存放数据对象 Json::Reader reader; // 定义解析对象 int res=reader.parse(json_str, root); // 把json_str解析到root对象中 (void)res; struct stu xm; xm.name = root["name"].asString(); // 从root对象中提取 xm.age = root["age"].asInt(); xm.weight = root["weight"].asDouble(); xm.print(); return 0; }
基本的过程就是像上面这样