目录
一,RapidJson和JsonCpp对比
二,RapidJson和JsonCpp下载地址
1.RapidJson下载
2.JsonCpp下载
三,RapidJson头文件及其功能介绍
1.rapidjson/document.h
2.rapidjson/writer.h
3.rapidjson/stringbuffer.h
4.rapidjson/reader.h
5.rapidjson/error/en.h
6.rapidjson/error/error.h
四,RapidJson使用案例
1.安装RapidJson
2.测试的Json数据
3.使用DOM解析器解析JSON
4.使用DOM解析器生成JSON
五,JsonCpp使用
六,其它
RapidJson和JsonCpp都是C++中流行的JSON解析器和生成器,并且都是开源库,具有许多相似的功能,但也有不同之处。
1.RapidJson优势
2.JsonCpp优势
3.两者的差异
4.根据具体需求进行选择



该头文件包含了DOM解析器和生成器所需的类和函数。DOM解析器是一种将JSON文本解析为DOM树的解析器,DOM树的结构对应于JSON文本的语法结构。DOM生成器是一种将DOM树转换为JSON文本的生成器。该头文件中的类包括:
该头文件包含了生成器所需的类和函数,用于将DOM树转换为JSON文本。该头文件中的类包括:
该头文件包含了一个字符串缓冲区类,用于存储生成器生成的JSON文本。该头文件中的类包括:
该头文件包含了SAX解析器所需的类和函数,用于将JSON文本解析为SAX事件流。SAX解析器是一种将JSON文本解析为SAX事件流的解析器,SAX事件流表示JSON文本的语法结构。该头文件中的类包括:
该头文件包含了RapidJSON的错误码和错误信息的定义。该头文件中的类包括:
该头文件包含了解析器和生成器可能出现的错误异常类的定义。该头文件中的类包括:
1.RapidJSON 是只有头文件的 C++ 库,没有安装过程。下载解压后只需把 include/rapidjson 目录拷贝到你的项目中即可开始使用(支持SAX和DOM两种解析方式:SAX解析器将JSON流解析为事件序列,而DOM解析器将JSON解析为内存中的树形结构)
VS2019工程

VsCode工程(参考)

准备测试读写的 example.json 文件内容(文件路径 E:\example.json)
{"FirstName": "Fu","LastName": "Cong","Age": 24,"Address": {"Street": "首创悦榕汇","City": "BeiJing","Country": "BeiJing"},"Phone numbers": ["+44 12345",678910]}
#include
#include
#include "rapidjson/document.h"
//返回指定文件的所有内容
char* readFile(std::string path)
{std::ifstream ifs;ifs.open(path, ios::in);char* data = NULL;long length; //文件大小if (ifs.is_open()) {//文件打开成功ifs.seekg(0, ios::end); //将文件流光标移动到文件末尾length = ifs.tellg(); //获取文件内容的大小(相对于文件开头的位移量来表示)data = (char*)malloc((length + 1) * sizeof(char));memset(data, '\0', length);ifs.seekg(0, ios::beg); //将文件光标重置到文件开头位置ifs.read(data, length); //一次性读取所有字符串ifs.close(); //关闭文件流return data;}return NULL;
}
void readJson()
{std::string jsonData(readFile("E:\\example.json"));rapidjson::Document doc; //Document是一个表示根DOM的JSON值。根可以是对象或数组。if(doc.Parse(jsonData.c_str()).HasParseError()){std::cout << "“正常”解析,解码字符串到新的缓冲区失败!" << std::endl;return;}else{std::cout << "解析文档成功!" << std::endl;}if (doc.IsObject()) {//JSON根数据是对象if (doc.HasMember("FirstName") && doc["FirstName"].IsString()) {std::cout << "FirstName:" << doc["FirstName"].GetString() << std::endl;}if(doc.HasMember("LastName") && doc["LastName"].IsString()){std::cout << "LastName:" << doc["LastName"].GetString() << std::endl;}if(doc.HasMember("Age") && doc["Age"].IsInt()){std::cout << "Age:" << doc["Age"].GetInt() << std::endl;}if(doc.HasMember("Address") && doc["Address"].IsObject()){rapidjson::Value &subObj = doc["Address"].GetObject();if(subObj.HasMember("Street") && subObj["Street"].IsString()){std::cout << "Street:" << subObj["Street"].GetString() << std::endl;}if(subObj.HasMember("City") && subObj["City"].IsString()){std::cout << "City:" << subObj["City"].GetString() << std::endl;}//从0.2版本开始,可以使用单一查找来检查成员的存在及其值(个人觉得并不好用)rapidjson::Value::MemberIterator street = subObj.FindMember("Country");if(street != doc.MemberEnd() && street->value.IsString()){std::cout << "Country:" << street->value.GetString() << std::endl;}}if(doc.HasMember("Phone numbers") && doc["Phone numbers"].IsArray()){const rapidjson::Value& arr = doc["Phone numbers"];for(rapidjson::SizeType i = 0; i< arr.Size();i++){if (arr[i].IsString()) {std::cout << arr[i].GetString() << std::endl;}if (arr[i].IsInt()) {std::cout << arr[i].GetInt() << std::endl;}}}}else if(doc.IsArray()){//JSON根数据是数组}
}
#include
#include
#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h" //存储生成的JSON文本,然后可以轻松地将其输出到文件或其他输出流中
#include "rapidjson/prettywriter.h" //生成带有格式的JSON文本,并将其输出到文件中
void writeJson()
{rapidjson::Document docRoot;docRoot.SetObject(); //创建一个JSON对象//加入键值对docRoot.AddMember("FirstName","Fu",docRoot.GetAllocator());docRoot.AddMember("LastName","Cong",docRoot.GetAllocator());docRoot.AddMember("Age",24,docRoot.GetAllocator());//添加子对象rapidjson::Value subObj(rapidjson::kObjectType);subObj.AddMember("Street","首创悦榕汇",docRoot.GetAllocator());subObj.AddMember("City","BeiJing",docRoot.GetAllocator());subObj.AddMember("Country","BeiJing",docRoot.GetAllocator());docRoot.AddMember("Age",subObj,docRoot.GetAllocator());//添加数组rapidjson::Value PhoneNumber(rapidjson::kArrayType);rapidjson::Value val1;val1.SetString("+44 12345", docRoot.GetAllocator());PhoneNumber.PushBack(val1,docRoot.GetAllocator());rapidjson::Value val2;val2.SetInt(678910);PhoneNumber.PushBack(val2,docRoot.GetAllocator());docRoot.AddMember("Phone numbers",PhoneNumber,docRoot.GetAllocator());//输出到Json文件中rapidjson::StringBuffer buffer; //创建一个StringBuffer对象// rapidjson::Writer writer(buffer); //创建一个Writer对象并将其与StringBuffer对象连接起来,生成不带有格式的JSON文本rapidjson::PrettyWriter writer(buffer); //创建一个PrettyWriter对象并将其与StringBuffer对象连接起来,生成带有格式的JSON文本docRoot.Accept(writer); //将JSON对象写入StringBuffer对象std::string json_str = buffer.GetString(); //将StringBuffer对象转换为std::stringstd::ofstream ofs;ofs.open("E:\\example.json",std::ios::out);if(ofs.is_open()){ofs << json_str;ofs.close();}
}
参考这篇文章: JsonCpp编译和使用 | 爱编程的大丙
cJSON的使用 :cJSON的API介绍和使用