常见的数据交换格式:XML
、
JSON
和
YML
XML
使用DTD(document type definition)文档类型定义来组织数据;格式统一,跨平台和语言,早已成为业界公认的标准。在web serivice应用中,至少就目前来说XML仍有不可动摇的地位。
优点:1.格式统一,符合标准;2.容易进行系统间数据交换、共享;
缺点:1.文件格式庞大、复杂,网络传输占用带宽较大;
2.需要大量代码来解析XML格式文件,复用性较差;
3.浏览器间存在差异,IE和其他浏览器对XML解析和操作存在差异;
JSON
是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。
优点:1.轻量级数据交换格式,用简单的key:value键值对即可标识所有对象关系,不需要过多的标签;
2.支持压缩,占用带宽小;
3.易于解析,客户端用JavaScript可以采用面向对象的方式直接获取JSON对象的属性,能直接被客户端使用,减少了客户端开发;
缺点:1.没有XML格式这么推广的深入人心和使用广泛, 没有XML那么通用性,出现较晚,还处于推广阶段;
2.对数据的描述性比XML差;
YAML
YAML是一种直观的能够被电脑识别的的数据数据序列化格式; 换种说法,YAML是一种很简单的类似于XML的数据描述语言,语法比XML简单很多。YAML试图用一种比XML更敏捷的方式,来完成XML所完成的任务。但YAML不是XML。
优点:1.可读性好;2. 和其它脚本语言的交互性好;3. 使用实现语言的数据类型;
4. 提供了一个一致的信息模型;5. 可以基于流来处理;
6. 表达能力强,扩展性好;7. 易于实现;
缺点:由于兼容性问题,不同语言间的数据流转,建议现在不要用YAML。
—————————————————————————————————
以下就详细的来讲讲JSON的数据格式
一、数据结构
JSON建构于两种结构:
1. “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),记录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
如:{“username”:”xiaoyang”,
“passwd”:”123456”
}
2. 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
如:{"authors": [
{ "firstName": "Isaac", "lastName": "Asimov", "genre": "science fiction" },
{ "firstName": "Tad", "lastName": "Williams", "genre": "fantasy" },
{ "firstName": "Frank", "lastName": "Peretti", "genre": "christian fiction" }
]}
二、数据类型
json 主要包含三种类型的 class:Value、Reader、Writer。
1)Value
基本的初始化
Json::Value root;
root ["username"] = Json::Value("xiaoming");
root["passwd"] = Json::Value("123456");
root["id"] = Json::Value(12);
std::string username = root["username"].asString();
std::string passwd = root["passwd"].asString();
std::string all = root.toStyledString();
printf("%s\n",all.c_str());
结果:
{
"id" : 12,
"passwd" : "123456",
"username" : "xiaoming"
}
2)Reader:解析为JSON形式的变量
const char* str = "{\"uploadid\": \"UP000000\",\"code\": 100,\"msg\": \"\",\"files\": \"\"}";
Json::Reader reader;
Json::Value root;
if (reader.parse(str, root)) // reader将Json字符串解析到root,root将包含Json里所有子元素
{
std::string upload_id = root["uploadid"].asString(); // 访问节点,upload_id = "UP000000"
int code = root["code"].asInt(); // 访问节点,code = 100
}
3)Writer
查看 json 内容,使用Writer 类即可,Jsoncpp 的 Json::Writer 类是一个纯虚类,并不能直接使用。在此我们使用 Json::Writer 的子类:Json::FastWriter、Json::StyledWriter、Json::StyledStreamWriter。