Json的使用
什么是JSON
JSON的英文全称为JavaScript Object Notation,是一种轻量级的数据交换格式。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C,C++,C#,Java,JavaScript,Perl,Python等)。这些特性使得JSON成为理想的数据交换语言,同时易于人阅读和编写,也易于机器解析和生成。
JSON语法
JSON语法规则概括
- 数据存储在名称/值对中
- 数据由逗号分隔
- 花括号保存对象
- 方括号保存数组
JSON名称/值对
JSON数据的书写格式是:名称/值对.名称是包含在双引号中的字段名,后面紧接着是一个冒号,然后是只,如: “name” :“Jack”。
JSON的值类型
JSON的值可以使:
- 数字(整数或浮点数)
- 字符串(在双引号中)
- 逻辑值(true或false)
- 数组(在方括号中,即[])
- 对象 (在大括号中,即{})
- NULL
JSON的结构
JSON有两种结构:JSON对象和JSON数组。
JSON对象
Json对象是Json数据格式的基本元素,在JSON中是用“{}”括起来的内容,数据结构为键值对结构:
{
key:value,
key:value,
...
key:value
}
如下:
{ "firstName":"John" , "lastName":"Doe" }
JSON数组
数组是在JSON中用“[]”括起来的内容,里面包含JSON对象,数据结构如下:
[JsonObj, JsonObj ...JsonObj]
JsonObj是Json对象,包含多个对象的例子如下
{"country":"China", "history":"5000年", "people":"14亿", "province":"34个省份", "supercity":[{"城市":"上海","地域":"华东","人口":"2100万","外号":"魔都"}, {"城市":"北京","地域":"华北","人口":"2300万","外号":"帝都"}, {"城市":"广州","地域":"华南","人口":"1600万","外号":"魔都"}]}
上例中,supercity是数据名,后面是数组值,包含三个Json对象。
JSON数组的取值方式使用索引获取,可以这样访问上例对象数组中的对象:
Json::Value supercity = china["supercity"]; int nSize = supercity.size(); for (int i = 0; i < nSize; ++i) { Json::Value city = supercity[i]; }
C++下如何使用Json——Jsoncpp库
Json只是一个一种数据交换格式,虽然起源于JavaScript,但是大多数语言都已经有实现了json的解析。jsoncpp是C++中广泛使用的解析JSON文件的跨平台开源库,可以从http://jsoncpp.sourceforge.net/上下载jsoncpp的源码。下载解压后,在makefiles文件里打开jsoncpp.sln工程,使用VS2003以上版本进行编译。注意:如果使用VS默认的编译选项MTd或者MT,在使用json_libmtd.lib的时候可能会出现LNK2038错误(我使用的VS2012 vc110环境),所以请修改MTD为MDd,MT为MD。然后在代码中包含相应的头文件以及附加的静态链接库就可以直接使用了。
jsoncpp预览
磨刀不误砍柴工,我们先来了解下jsoncpp中实现json数据交换格式的最基本的几个类:
- Json::Value类:包含在value.h头文件中,主要实现json的值类型,可以表示json语法支持的Int、UInt、double、const char*以及Value类型。使用Value可以用来描述json的数据组织结构。
- Json::Reader类:包含在reader.h中,主要功能是将json格式的文件流或字符串解析到Json::Value中,包括两个重载函数parse,使用中基本只会调用到parse。
- Json::Writer类:包含在writer.h头文件中,此类的功能和Reader相反,是将Json::Value值转化成一个字符串或文件流。注意Writer是基类,不能直接调用。它有三个继承类:Json::FastWriter,Json::StyledWriter和JSon::StyleStreamWriter,。FastWriter类转换Value时不带Json格式格式,不是很友好,但是足够用了。StyledWriter类转换Value时则带有JSon格式,StyleStreamWriter返回的是stream流。
写json文件
在这个例子中我们将使用创建一个json文件,此文件格式就是前面我们所举得的关于china的例子,如下:
void WriteJsonFile() { Json::Value china, supercity, shanghai,beijing,guangzhou; //设置china相关数据 china["country"] = "China"; china["people"] = "14亿"; china["history"] = "5000年"; china["province"] = "34个省份"; //设置上海数据 shanghai["城市"] = "上海"; shanghai["人口"] = "2100万"; shanghai["外号"] = "魔都"; shanghai["地域"] = "华东"; //设置北京数据 beijing["城市"] = "北京"; beijing["人口"] = "2300万"; beijing["外号"] = "帝都"; beijing["地域"] = "华北"; //设置广州数据 guangzhou["城市"] = "广州"; guangzhou["人口"] = "1600万"; guangzhou["外号"] = "魔都"; guangzhou["地域"] = "华南"; //将上海、北京、广州添加到超级大城市数组中 supercity.append(shanghai); supercity.append(beijing); supercity.append(guangzhou); //将supercity添加到china对象中 china["supercity"] = supercity; //将Json数据写入到文件中 Json::StyledWriter writer; std::string strChina = writer.write(china); std::ofstream ofs; ofs.open("china.json"); if (ofs.is_open()) { ofs<<strChina; //将字符串写入到文件中 } }
读Json文件
上面的例子,我们创建了名为china.json的Json文件,现在我们再把它出去出来:
void ReadJsonFileAndParse() { std::ifstream ifs; ifs.open("china.json"); if (!ifs.is_open()) return; Json::Value china; Json::Reader reader; reader.parse(ifs, china); //输出china中的对象 printf("country:%s\n", china["country"]); printf("people:%s\n", china["people"]); printf("history:%\ns", china["history"]); printf("province:%s\n", china["province"]); //获取supercitye数组 Json::Value supercity = china["supercity"]; int nSize = supercity.size(); //获取supercity数组大小 //遍历数组 for (int i = 0; i < nSize; ++i) { Json::Value city = supercity[i]; //根据索引获取supercity中的Json子对象 printf("城市:%s\n", supercity[i]["城市"]); printf("人口:%s\n", supercity[i]["人口"]); printf("外号:%s\n", supercity[i]["外号"]); printf("地域:%s\n", supercity[i]["地域"]); } }
参考资料:http://www.cnblogs.com/kex1n/archive/2011/12/02/2272328.html
http://baike.baidu.com/view/136475.htm?fr=aladdin
http://www.cppfans.org/1445.html