JSON:JavaScript 对象表示法(JavaScript Object Notation)
序列化是将对象状态转换为可保持或传输的格式的过程,反序列换则是将流转换为对象。JSON用于数据传输时,基本上是先转换成字符串形式后再进行传输,使用方拿到字符串后再解析出JSON,得到各个字段的内容。
JSON 数据的书写格式是:名称/值对,名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值。
JSON 值可以是:
对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束,“‘名称/值’ 对”之间使用“,”(逗号)分隔。
数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
数组可包含多个对象:
{
“employees”: [
{ “firstName”:“John” , “lastName”:“Doe” },
{ “firstName”:“Anna” , “lastName”:“Smith” },
{ “firstName”:“Peter” , “lastName”:“Jones” }
]
}
在上面的例子中,对象 “employees” 是包含三个对象的数组。每个对象代表一条关于某人(有姓和名)的记录。
值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套。
字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。
数值(number)也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。
JSON建构于两种结构:
使用环境Redhat 6.5,系统中已经装了python的环境。这里编译JsonCpp需要用到工具scons,先用已root的用户权限执行yum install scons命令来安装scons,等到提示“Complete!”就是安装成功了。
解压JsonCpp的压缩包,进入解压目录后,执行“scons platform=linux-gcc”命令,它会自行编译。
编译出来库文件在其libs/linux-gcc-4.4.7目录下,有库文件libjson_linux-gcc-4.4.7_libmt.a和libjson_linux-gcc-4.4.7_libmt.so。头文件在解压目录下的include/json。
新建jsoncpptest文件夹,把libjson_linux-gcc-4.4.7_libmt.a和头文件复制到该目录下。
1 #include
2 #include
3 #include "json.h"
4 int main()
5 {
6 Json::Value json_temp;
7 json_temp["name"] = Json::Value("zhangsan");
8 json_temp["age"] = Json::Value(18);
9
10 Json::Value root;
11 root["key_array"].append("array_string");
12 root["key_array"].append(1234);
13 root["key_string"] = Json::Value("value_string");
14 root["key_number"] = Json::Value(12345);
15 root["key_boolean"] = Json::Value(false);
16 root["key_double"] = Json::Value(12.345);
17 root["key_object"] = json_temp;
18
19 Json::FastWriter fast_writer;
20 std::cout << fast_writer.write(root);
21 Json::StyledWriter styled_writer;
22 std::cout << styled_writer.write(root);
23
24 std::string str_test = "{\"id\":1,\"name\":\"zhangsan\"}";
25 Json::Reader reader;
26 Json::Value value;
27 if(!reader.parse(str_test, value))
28 {
29 return 0;
30 }
31 std::string value_name = value["name"].asString();
32 std::cout << value_name << std::endl;
33 std::cout << value["name"] << std::endl;
34
35 if(!value["id"].isInt())
36 {
37 std::cout << "id is not int\n" << std::endl;
38 }else{
39 int value_id = value["id"].asInt();
40 std::cout << value_id << std::endl;
41 }
42 return 0;
43 }
使用下面命令编译cpp测试文件:
JsonCpp主要包括3种类型的类:Value、Reader、Writer。JsonCpp中所有对象、类名都在命名空间JSON中,使用时包含json.h即可。Json::Value是JsonCpp中最基本、最重要的类,用于表示各种类型的对象,JsonCpp支持的对象类型可见Json::ValueType枚举值。定义一个Json::Value对象并赋值字符串、数值、布尔值、浮点数、Json::Value对象、数组6种类型。添加数组的值需要用append函数。
JsonCpp的Json::Writer类是一个纯虚类,并不能直接使用。其子类Json::FastWriter、Json::StyledWriter、Json::StyledStreamWriter可以使用。其中Json::FastWriter来处理JSON是最快的,用Json::StyledWriter得到的是格式化后的JSON。
JSON::Reader是用于读取的,将字符串转换为Json::Value对象的。
std::string str_test = "{\"id\":1,\"name\":\"zhangsan\"}";
Json::Reader reader;
Json::Value value;
if(!reader.parse(str_test, value))
ifstream ifs;
ifs.open("testjson.json");
assert(ifs.is_open());
Json::Reader reader;
Json::Value root;
if (!reader.parse(ifs, root, false))
获取JSON对象中的元素值有2种方法,比如value[“name”].asString()和value[“name”]。asString方法返回的没有双引号。
判断数据类型vaule[“id”].isInt()。
参考:
http://www.cnblogs.com/kex1n/archive/2011/12/02/2272328.html