感谢开源! git上有很多解析json的库文件,比如常见的JsonCpp、cJSON等,这些都能满足正常使用。但一旦有了速度、轻量化、简便的追求,就不得不比较一下各个库的优劣了。
荡某乎上的一张各种比较json的性能图,可以看出,rapdJson处于领先地位!
楼主自从体验了rapidJson,就果断放弃了JsonCpp,原因也很简单!
RapidJson的github地址:
https://github.com/Tencent/rapidjson
- 只有头文件,也只需要包含头文件!jsoncpp还需要内置编译或编译成库,麻烦
- 只支持标准的json文件,不标准的不支持,按照标准来,节约成本!
- 当然,缺点也很明显,代码接口复杂,代码量比较大
某知乎地址:
https://www.zhihu.com/question/23654513
一、解析json文件的Demo
char *pchJsonPath = "config.json";
std::ifstream file(pchJsonPath);
std::string strJson((std::istreambuf_iterator<char>(file)),
std::istreambuf_iterator<char>());
rapidjson::Document doc;
doc.Parse(strJson.c_str());
解析后,需要判断一下解析是否成功
if (doc.HasParseError())
{
printf("解析json文件失败,请检查json是否正确!\n");
}
然后再将赋值给json中的Value,
rapidjson::Value& jsonObj = doc;
这里的Value就相当于字典
1、解析json中的Std所保存的Float值
if (jsonObj.HasMember("Std")) // 一定要判断,如果没有key,会导致代码直接报错
{
tOpenParam.fStd = jsonObj["Std"].GetFloat();
}
else
{
printf("请检查,key中没有发现 Std");
hr = E_INVALIDARG;
}
2、解析json中的数组
if (jsonInputNode.HasMember("Shape"))
{
rapidjson::Value& jsonShape = jsonInputNode["Shape"];
if (jsonShape.IsArray())
{
for (rapidjson::SizeType idxType = 0; idxType < jsonShape.Size(); ++idxType)
{
std::cout << jsonShape[idxType].GetInt() << " ";
}
}
}
3、解析字符串
if (jsonObj.HasMember("DeviceType"))
{
std::string strDeviceType = jsonObj["DeviceType"].GetString();
}
每次都需要检查,代码量就显的比较大,也比较杂乱,这也劝退了一部分人,所以最好在原来的基础上,再封装一层代码,比如用CKECK_ERROR
来替换jsonObj.HasMember
。