一、jsoncpp介绍
jsoncpp是一个用于序列化和反序列化JSON数据的C++库。它由Thunder Jenkins编写,可用于许多不同类型的应用程序,从简单的命令行工具到大型分布式系统。jsoncpp支持C++98/03标准,并且在这些标准下提供了一些高级功能。
jsoncpp主要特点有:
1. 速度快,因为是用C++编写的
2. 高效,支持读写任意大小的JSON文件并使用内存映射技术进行高速读取,同时支持延迟加载
3. 易用性高,提供了许多简便的方法,可以快速地实现JSON序列化和反序列化
二、jsoncpp的使用
jsoncpp的用法很简单,只需包含json/json.h文件即可使用。以下是一个基本示例:
#include#include "json/json.h" using namespace std; int main() { Json::Value root; // 创建一个根节点 root["name"] = "Tom"; // 添加一对“键/值”对 root["age"] = 20; cout << root.toStyledString() << endl; // 输出JSON格式的字符串 return 0; }
输出结果为:
{ "name" : "Tom", "age" : 20 }
可以看出,jsoncpp提供了一个非常简洁的API,可以轻松地创建和解析JSON对象。同时,jsoncpp还支持从JSON文件中读取和写入JSON对象,而不需要我们手动解析和序列化。
三、jsoncpp的高级用法
1. 对象序列化和反序列化
在jsoncpp中,对象可以使用Json::Value类型表示。可以使用Json::StyledWriter或Json::FastWriter类将Json::Value对象序列化为JSON字符串。以下是一个示例:
#include#include "json/json.h" using namespace std; class Person { public: string name; int age; }; int main() { Person p; p.name = "Tom"; p.age = 20; // 序列化 Json::Value root; root["name"] = p.name; root["age"] = p.age; Json::StyledWriter writer; string json_str = writer.write(root); // 将Json::Value对象序列化为JSON字符串 cout << json_str << endl; // 反序列化 Json::Reader reader; Json::Value value; reader.parse(json_str, value); // 将JSON字符串解析为Json::Value对象 p.name = value["name"].asString(); p.age = value["age"].asInt(); cout << p.name << ", " << p.age << endl; return 0; }
上面的程序演示了如何将一个自定义的Person对象序列化为JSON字符串,并在需要的时候反序列化成原始对象。Json::Value对象是一个非常灵活的数据类型,可以存储任意类型的数据,包括JSON数组、JSON对象和基本类型。
2. JSON文件读写
jsoncpp还提供了从JSON文件中读取和写入JSON对象的API,可以使用Json::Reader和Json::StreamWriter类进行文件解析和输出。以下是一个使用JSON文件的示例:
#include#include #include "json/json.h" using namespace std; int main() { Json::Reader reader; Json::Value root; ifstream ifs("person.json"); reader.parse(ifs, root); // 从JSON文件中解析JSON对象 string name = root["name"].asString(); int age = root["age"].asInt(); cout << name << ", " << age << endl; ofstream ofs("person.json"); Json::StyledStreamWriter writer; writer.write(ofs, root); // 将JSON对象写入JSON文件 return 0; }
上面的程序演示了如何从JSON文件中读取JSON对象,并将修改后的JSON对象写回同一个文件。Json::StreamWriter提供了非常灵活的输出格式选项,可以控制输出格式,使输出更加易于阅读。
3. JSON数据校验
Jsoncpp还支持使用Json::Value::isValid()方法检查Json::Value对象中的数据是否有效。Json::Value::isNull()方法用于检查对象是否为空。以下是一个示例:
#include#include "json/json.h" using namespace std; int main() { Json::Value root; // 下面这行会替换掉上面的Json::Value对象 Json::Reader reader; reader.parse("null", root); // 将JSON字符串解析为Json::Value对象 if(root.isValid() && !root.isNull()) { cout << "JSON object is valid" << endl; } else { cout << "JSON object is invalid" << endl; } return 0; }
可以看到,isValid()方法只有在Json::Value对象有效时才会返回true。isNull()方法在对象为空时返回true。
4. JSON数据访问
jsoncpp还支持使用Json::Value::isArray()、Json::Value::isObject()和Json::Value::size()方法设置和访问JSON数据。下面是一个示例:
#include#include "json/json.h" using namespace std; int main() { Json::Value root; Json::Value array; for(int i = 0; i < 3; ++i) { Json::Value val; val["name"] = "Tom"; val["age"] = 20 + i; array.append(val); // 在JSON数组中添加元素 } root["person"] = array; // 将JSON数组添加到JSON对象中 if(root["person"].isArray()) { int size = root["person"].size(); for(int i = 0; i < size; ++i) { cout << root["person"][i]["name"].asString() << ", " << root["person"][i]["age"].asInt() << endl; } } return 0; }
可以看到,使用Json::Value::isArray()方法可以判断JSON对象是否为数组。使用Json::Value::size()方法可以获取JSON数组中元素的数量。可以使用Json::Value::append()方法向JSON数组中添加元素,并使用Json::Value::asString()和Json::Value::asInt()等方法访问数据。
总结
jsoncpp是C++中一个很实用的JSON库,使用它可以轻松地实现JSON数据的序列化和反序列化。jsoncpp还提供了高级函数,可以帮助开发人员处理常见的JSON数据必需和高效的读写操作。