Json全称JavaScript Object Notation,Json本身是用于标记 Javascript 对象的,官方的定义其是作为一种轻量级的数据传输格式而存在的。不过虽然Json是为Javascript而设计的,但实际上已经成为一种被广泛使用的数据传输格式。
关于Json,人们最经常讨论到的,就是Json和XML两种标准的对比,两者的共同点是都有非常强大的扩展性、灵活性,但又有各自擅长的领域,XML的优点在于很好的可读性,Json的优势则是在精简的结构,也正是因为这个原因,Json更适合用于网络数据的传输。
Json目前已经有了几乎所有主流语言的版本,你可以在Json的官网中找到它们:http://json.org
目前我们的项目的客户端和服务器之间的数据传输使用的就是Json,为我们的工作确实提供不小的便利,在这里简单总结一下Json的基本结构和功能,权作笔记:
我们首先应该对Json的格式有所了解,当你打开官网的文档,你会发现它的格式异乎寻常的简单,但却抽象的非常完美,原作者甚至表示这个规则永远不会升级,因为似乎没有这个必有……
Json认为所有的数据都可以通过数组和对象来表示:
- 对象是一个或一组无序的名称/值(Key/Value)的集合。一个对象以“{”开始,“}”结束。每个“名称”后跟一个“:”;名称/值之间使用“,”分隔
- 数组是值(value)的有序集合。一个数组以“[”开始,“]”结束,值之间使用“,”分隔
- 值(value)可以是双引号括起来的字符串(string)、数值(number)、布尔(true/false)、 null、对象(object)或者数组(array)。这些结构可以嵌套
- 字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义
- 数值(number)也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式
我们的项目使用的是C++作为开发语言,所以我们使用json的C++版本jsoncpp,这也是官网首推的C++版本的Json,你可以在这里得到它:http://sourceforge.net/projects/jsoncpp/
下面我们需要做的是把jsoncpp加入到我们的工程中来,我们有很多种方法,比如编译成链接库,而且实际上jsoncpp已经为我们提供了现成的预设好参数的工程文件。不过相比这样,我选择了直接把源文件加入工程参与编译的方式,虽然会增加一点Rebuild的时间,但是可以让我们的工程在Win32、iOS、Android环境下工程结构的一致性。
jsoncpp 主要包含三种类型的 class:Value、Reader和Writer。jsoncpp 中所有对象、类名都在命名空间Json 中,包含 json.h 即可使用。
Value
Json::Value 是jsoncpp 中最基本、最重要的类,用于表示各种类型的对象,jsoncpp 支持的对象类型可见 Json::ValueType 枚举值。
Json::Value类的基本使用方法:
Json::Value jData; // 临时对象,供如下代码使用
jData["country"] = Json::Value("China");
jData["code"] = Json::Value(86);
Json::Value jObject; // 表示整个 json 对象
jObject["TypeString"] = Json::Value("I like big butt");
jObject["TypeNumber"] = Json::Value(54188);
jObject["TypeBoolean"] = Json::Value(false);
jObject["TypeDouble"] = Json::Value(54.188);
jObject["TypeObject"] = jData;
jObject["TypeArray"].append("I also like boobs"); //键名字为TypeArray的Key,包含数组,其中第一个为字符串字符串
jObject["TypeArray"].append(512); //数组的第二个元素为数字
Json::ValueType type = jObject.type(); // 获得 jObject 的类型,此处为 objectValue 类型
而它所对应的Json的格式则是:
{
"TypeArray " : [ "I also like boobs ", 512 ],
"TypeBoolean " : false,
"TypeDouble" : 54.188,
"TypeNumber" : 54188,
"TypeObject" : {
"code" : 86,
"country" : "China"
},
"TypeString" : "I like big butt"
}
Writer
对Json内容转换则需要用到Writer类。
Jsoncpp 的 Json::Writer 类是一个纯虚类,我们实际使用的它的子类:Json::FastWriter、Json::StyledWriter、Json::StyledStreamWriter。
虽然转换成字符后的格式略有不同,但其实它们共同的作用都是将Json的对象转换为用于数据交换的文本格式。
Reader
Reader相对于Writer,顾名思义就是将收到的Json内容的字符串转换为Json::Value对象的。
Json::Reader reader;
Json::Value jObject;
const char* jDocument = "{"code" : 86,"Country" : "China"}";
if (!reader.parse(jDocument, jObject))
return 0;