C++ JSON解析之jsoncpp库的使用
1.介绍
轻量级的数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据,层次结构简洁清晰,易于人阅读和编写,易于机器解析和生成。
2.语法规则
a.名称/值对的集合(对象、记录、结构、字典)
{}
b.值的有序列表(数组)
[]
数据在名称/值对中
数据由逗号分隔
大括号保存对象
中括号保存数组
值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。
结构可以嵌套。
example:
{
"action" : "run",
"data" :
{
"number" : 1
}
}
3.数据解析
json文件的保存
Json::Value root;
Json::Value data;
root["action"] = "run";
data["number"] = 1;
root["data"] = data;
Json::StreamWriterBuilder builder;
std::ofstream ofs;
ofs.open("D:\\test.json");
assert(ofs.is_open());
builder.newStreamWriter()->write(root, &ofs);
json文件的读取
//方式一
Json::Value root;
std::ifstream ifs;
ifs.open("D:\\test.json");
Json::CharReaderBuilder builder;
JSONCPP_STRING errs;
if (!parseFromStream(builder, ifs, &root, &errs))
{
std::cout << errs << std::endl;
return EXIT_FAILURE;
}
CString name = root["action"].asCString();
int num = root["data"]["number"].asInt();
cout << name << endl;
cout << num << endl;
return EXIT_SUCCESS;
//方式二
Json::Value root;
std::ifstream ifs;
ifs.open("D:\\test.json");
Json::Reader reader;
if (reader.parse(ifs,root,false))
{
CString name = root["action"].asCString();
int num = root["data"]["number"].asInt();
cout << name << endl;
cout << num << endl;
}
//!!!无法获取key值!!!
//vector<string> Members;
// Members = root.getMemberNames();
字符串的解析
const std::string rawJson = R"({"Age": 20, "Name": "colin"})";
const auto rawJsonLength = static_cast<int>(rawJson.length());
JSONCPP_STRING err;
Json::Value root;
Json::CharReaderBuilder builder;
const std::unique_ptr<Json::CharReader> reader(builder.newCharReader());
if (!reader->parse(rawJson.c_str(), rawJson.c_str() + rawJsonLength, &root, &err))
{
std::cout << "error" << std::endl;
return EXIT_FAILURE;
}
vector<string> Members;
Members = root.getMemberNames();
CString ss, temp;
for (int m = 0; m < Members.size(); m++) {
temp.Format("key=%s,Value=%s \n", Members[m].c_str(),
root[Members[m]].asString());
ss += temp;
}
MessageBoxA(NULL, ss, "Result", MB_OK);
判断key值是否存在
bool Json::Value::isMember ( const char * key) const
添加数据
Json::Value data;
data["value1"] = "111";
data["value2"] = "222";
data["value3"] = "333";
root["Data"]=data;
删除数据
if( root.isMember("Data"))
{
root.removeMember("Data");
}