c++json库jsoncpp使用方法
最近做项目的时候用到json处理数据,查了一下发现jsoncpp使用比较方便,但网上的教程基本都是老版本的api教程,编译器编译的时候会报错,于是研究了一下新版本api的使用方法,记录一下,以后万一忘了还能翻着看看。
github下载地址
https://github.com/open-source-parsers/jsoncpp
## 使用源文件
在github上下载好以后,在命令行下进入该项目所在的地址,直接执行python amalgamate.py命令,会在dist目录下生成两个头文件和一个源文件json-forwards.h 、json.h和jsoncpp.cpp。因为jsoncpp源码就四五千行,直接放在jsconcpp.cpp中和工程中其他代码一起编译也比较方便。
执行完命令之后的效果,把他们分别放进源文件和头文件的目录里就可以
随便写一个json数据
{
"Name": "Liming",
"Age": 26,
"Language": ["C++", "Java"],
"E-mail": {
"Netease": "lmshao@163.com",
"Hotmail": "liming.shao@hotmail.com"
}
}
stringWrite(生成json字符串)
std::string createJson()
{
std::string jsonStr;
Json::Value root, lang, mail;
Json::StreamWriterBuilder writerBuilder;
std::ostringstream os;
root["Name"] = "Liming";
root["Age"] = 26;
lang[0] = "C++";
lang[1] = "Java";
root["Language"] = lang;
mail["Netease"] = "lmshao@163.com";
mail["Hotmail"] = "liming.shao@hotmail.com";
root["E-mail"] = mail;
std::unique_ptr<Json::StreamWriter> jsonWriter(writerBuilder.newStreamWriter());
jsonWriter->write(root, &os);
jsonStr = os.str();
std::cout << jsonStr << std::endl;
return jsonStr;
}
streamWrite(生成json文件)
std::string createJson()
{
std::string jsonStr;
Json::Value root, lang, mail;
Json::StreamWriterBuilder writerBuilder;
std::ostringstream os;
root["Name"] = "Liming";
root["Age"] = 26;
lang[0] = "C++";
lang[1] = "Java";
root["Language"] = lang;
mail["Netease"] = "lmshao@163.com";
mail["Hotmail"] = "liming.shao@hotmail.com";
root["E-mail"] = mail;
std::unique_ptr<Json::StreamWriter> jsonWriter(writerBuilder.newStreamWriter());
jsonWriter->write(root, &os);
jsonStr = os.str();
ofstream outfile("C:\\Users\\Administrator\\Desktop\\out.json");
outfile << jsonStr;
outfile.close();
}
readFromString(从json字符串中读取数据)
bool parseJson(const std::string &info)
{
if (info.empty()) {
std::cout << "info.empty!" << std::endl;
return false;
}
bool res;
JSONCPP_STRING errs;
Json::Value root, lang, mail;
Json::CharReaderBuilder readerBuilder;
std::unique_ptr<Json::CharReader> const jsonReader(readerBuilder.newCharReader());
res = jsonReader->parse(info.c_str(), info.c_str() + info.length(), &root, &errs);
if (res == 0)std::cout << "RES = 0" << std::endl;
if (!res || !errs.empty()) {
std::cout << "parseJson err. " << errs << std::endl;
}
std::cout << "Name: " << root["Name"].asString() << std::endl;
std::cout << "Age: " << root["Age"].asInt() << std::endl;
lang = root["Language"];
std::cout << "Language: ";
for (int i = 0; i < lang.size(); ++i) {
std::cout << lang[i] << " ";
}
std::cout << std::endl;
mail = root["E-mail"];
std::cout << "Netease: " << mail["Netease"].asString() << std::endl;
std::cout << "Hotmail: " << mail["Hotmail"].asString() << std::endl;
return true;
}
int main(int argc, char *argv[])
{
string x=createJson();
parseJson(x);
return 0;
}
得到结果
readFromString(从json文件中读取数据)
bool parseJson()
{
Json::Value root, lang, mail;
std::ifstream ifs;
ifs.open("out.json");
Json::CharReaderBuilder builder;
builder["collectComments"] = true;
JSONCPP_STRING errs;
if (!parseFromStream(builder, ifs, &root, &errs)) {
std::cout << errs << std::endl;
return false;
}
std::cout << "Name: " << root["Name"].asString() << std::endl;
std::cout << "Age: " << root["Age"].asInt() << std::endl;
lang = root["Language"];
std::cout << "Language: ";
for (int i = 0; i < lang.size(); ++i) {
std::cout << lang[i] << " ";
}
std::cout << std::endl;
mail = root["E-mail"];
std::cout << "Netease: " << mail["Netease"].asString() << std::endl;
std::cout << "Hotmail: " << mail["Hotmail"].asString() << std::endl;
return true;
}
int main(int argc, char *argv[])
{
string x=createJson();
parseJson();
return 0;
}
得到同样的结果
总结
可以把Json::Value理解为一个Json结构,这个类型可以嵌套,也可以当做数组一样使用,在需要的时候可以把这个结构转为相应的类型。
比如:
我们已经知道root[“Name”]存放的是一个string,可以把使用.asString()转换为string类型;
知道root[“Language”]这个Json::Value是一个数组,就可以像数组一样使用下标进行取值;
知道root[“E-mail”]这个Json::Value里面是嵌套的一个json,就可以和root结构一样进行处理。
参考资料
https://blog.csdn.net/shaosunrise/article/details/84680602
https://github.com/open-source-parsers/jsoncpp/tree/master/example