什么是Json
Json数据格式说明:[https://www.json.org/json-en.html](https://www.ctyun.cn/portal/link.html?target=https%3A%2F%2Fwww.json.org%2Fjson-en.html)
Json(JavaScript Object Notation )是一种轻量级的数据交换格式。简而言之,Json组织形式就和python中的字典, C/C++中的map一样,是通过key-value对来组织的,key是任意一个唯一字符串,value可以是bool,int,string 或者嵌套的一个json。关于Json 格式可以参考官方网站。
Jsoncpp处理Json
是一个用来处理 Json文本的开源C++库。源码下载地址:http://sourceforge.net/projects/jsoncpp/
1)从文件中读取Json
std::ifstream ifs;
ifs.open("testdata.json", std::ios::binary);
Json::Reader reader(Json::Features::strictMode());
Json::Value root;
if (NULL == reader.parse(ifs, root))
{
ifs.close();
return;
}
ifs.close();
2)从缓存中读取Json
std::string strText = "{\"total\":1,\"toReturn\":[{\"createTime\":\"20080806114526000+0800\",\"createUser\":\"李四\"}],\"success\":false}";
//std::string strText = "{\r\n\"success\":false,\r\n\"toReturn\":[\r\n{\r\n\"createTime\":\"20080806114526000+0800\",\r\n\"createUser\":\"李四\"\r\n}\r\n],\r\n\"total\":1\r\n}\r\n";
//std::string strText = "{\n \"success\" : false,\n \"toReturn\" : [\n {\n \"createTime\" : \"20080806114526000+0800\",\n \"createUser\" : \"李四\"\n }\n ],\n \"total\" : 1\n}\n";
Json::Reader reader(Json::Features::strictMode());
Json::Value root;
if (NULL == reader.parse(strText, root)) return;
std::string strContext = root.toStyledString();
int nTotal = root["total"].asInt();
第二个添加了回车换行,不影响解析
第三个进行了格式化操作,不影响解析
3)数字的读取可以当作字符串读取出来
Json::Value valueRoot;
valueRoot["value"] = 45.63455;
std::string strTest = valueRoot.toStyledString();
Json::Reader reader(Json::Features::strictMode());
Json::Value root;
if (reader.parse(strTest, root))
{
std::string strValue;
if (!root["value"].isNull())
{
//本来value的值是一个浮点型,也可以通过转换成字符串读取到变量中
strValue = root["value"].asString();
}
}
注意
1)断言问题
JsonCpp解析非法Json时,会主动容错成字符类型,对字符类型取下标时,会触发assert终止程序。解决的方法:启用严格模式,当解析非法Json时返回false,不再自动容错。创建读取对象的时候,指定特性:Json::Reader reader(Json::Features::strictMode());
不提倡使用 Json::Reader reader;
2)记事本打开问题
Json格式的文本文件用Windows的记事本打开,可能会往文本中添加BOM标识,导致读取失败,建议使用Notepad++进行修改查看
3)打开方式
读取文件的时候,需要设置文件的打开方式,std::ios::binary指定了二进制的读取方式,完整的读取所有的数据,这个跟读取视音频文件的方式是一样的
4)Use CharReader and CharReaderBuilder instead
编译出错:error C4996: 'Json::Reader::Reader': Use CharReader and CharReaderBuilder instead
: 参见“Json::Reader::Reader”的声明
新版本已经标志Json::Reader::Reader为废弃接口,编译情况下可能会出错提示,根据编译器的不同,而提示不同
解决方案:
打开工程属性,C/C++,常规,SDK检查,选择否