JsonCpp入门一:在linux下编译使用JsonCpp

JSON:JavaScript 对象表示法(JavaScript Object Notation)

JSON介绍

序列化是将对象状态转换为可保持或传输的格式的过程,反序列换则是将流转换为对象。JSON用于数据传输时,基本上是先转换成字符串形式后再进行传输,使用方拿到字符串后再解析出JSON,得到各个字段的内容。

JSON 数据的书写格式是:名称/值对,名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值

JSON 值可以是:

  • 对象(在花括号中)
  • 数组(在方括号中)
  • 数字(整数或浮点数)
  • 字符串(在双引号中)
  • 逻辑值(true或false)
  • null

对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束,“‘名称/值’ 对”之间使用“,”(逗号)分隔。
在这里插入图片描述
数组是值(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建构于两种结构:

  • “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
  • 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
    这两个是JSON中比较复杂的结构。

JsonCpp安装及使用

使用环境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 <iostream>
  2 #include <string>
  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

猜你喜欢

转载自blog.csdn.net/asmartkiller/article/details/89385471