怎么找网站的根目录,企业品牌战略,吉林市网站推广,做空气开关那个网站推广比较好目录
一#xff0c;序列化和反序列化的说明
二#xff0c;Jsoncpp库的介绍
三#xff0c;Jsoncpp库的使用
3-1#xff0c;Json::Value类
3-2#xff0c;Json::StreamWriter类
3-3#xff0c;Json::CharReader类 一#xff0c;序列化和反序列化的说明 序列化与反…目录
一序列化和反序列化的说明
二Jsoncpp库的介绍
三Jsoncpp库的使用
3-1Json::Value类
3-2Json::StreamWriter类
3-3Json::CharReader类 一序列化和反序列化的说明 序列化与反序列化主要用于对象的存储与传输。 序列化和反序列化主要涉及到将数据通常是内存中的对象转换为一种格式以便可以存储或传输然后再将这种格式转换回原始的数据形式以便读取原本信息。 序列化就是把内存中的对象比如一个包含多个属性和方法的对象转换成一个字节流或字符串等能够方便存储和传输的格式这个字节流包含了对象的所有信息。这样做的目的是方便存储比如保存到文件或数据库中或传输比如通过网络发送给另一台计算机。 反序列化就是把之前序列化得到的字节流或者字符串等格式重新转换回原来的对象。在这个过程中从存储区或传输流中读取对象的状态信息并重新构建对象从而恢复对象的状态和行为。这样对象就可以在另一台计算机上被恢复和使用。在网络传输或持久化存储场景中反序列化是获取对象的必要步骤。 模拟实现序列化与反序列化一般是将对象比如一个类中的所有要发送的信息存储到一个字符串里进行发送即序列化接收方接收到这里字符串后会将其还原成原本的对象形式读取即反序列化。
二Jsoncpp库的介绍 Jsoncpp是一个用于处理JSON数据的C库。 这里先来说明下JSON。JSON是一种数据格式它采用完全独立于语言的文本格式来存储和表示数据。JSON数据的基本结构有两种对象和数组。 对象对象在JSON中表示为无序的键值对集合使用花括号{}括起来。每个键值对之间使用逗号‘,’分隔键和值之间使用冒号:分隔。键必须是字符串值可以是字符串用常规双引号 括起来表示、数字数字包括整形和浮点型直接使用、对象、数组用中括号 [] 括起来表示、布尔值或null。 示例 C代码表示 char* name John; int age 30; char* city New York; Json表示 { name: John, age: 30, city: New York } 数组数组在JSON中表示为有序的值列表键只能是字符串使用方括号[]括起来。每个值之间使用逗号‘,’分隔。数组的值可以是任何JSON支持的数据类型包括对象如下 示例 { 姓名 : xx, 年龄 : 18, 成绩 : [88.5, 99, 58], 爱好 { 书籍 : 西游记, 运动 : 打篮球, 游戏 : [ { 苹果 : a, 安卓 : b }, { Linux : c, Windows : d } ] } } Jsoncpp库主要提供两个核心功能1将C中的数据结构如对象、数组等序列化为JSON格式的字符串。2将JSON格式的字符串反序列化。 Jsoncpp库默认是没有的若要使用需要安装此库Ubuntu/Centos系统的安装指令如下 Ubuntu系统sudo apt install libjsoncpp-dev Centos系统sudo yum install jsoncpp-devel 安装完后我们可在 /usr/include/ 路径下看到 jsoncpp目录里面包含 json目录json目录中包含各种头文件我们使用的头文件是json.h其它的基本用不到即运用Jsoncpp库时只需要加入jsoncpp/json/json.h头文件即可。
三Jsoncpp库的使用 Jsoncpp 库主要借助Json::Value、Json::StreamWriter、Json::CharReader三个类以及其对应的少量成员函数完成序列化及反序列化。
3-1Json::Value类 Json::Value类是用于存储和管理Json数据的类该类是一种中间数据存储类即若要将数据对象进行序列化就需要先存储到Json::Value对象中若要将Json数据反序列化就需要将解析后的数据对象存储到Json::Value对象中。下面来说明该类常用的成员函数功能结构如下 class Json::Value { // Value重载了[]和因此所有的赋值和获取数据都可以通过即完成 val[name] xx 的功能 Value operator(const Value other); Value operator[](const std::string key); Value operator[](const char* key); Value removeMember(const char* key); //移除值为key的元素 // ArrayIndex是Jsoncpp库中自定义整形的数据类型它用来表示数组的下标 const Value operator[](ArrayIndex index) const; // 完成对数组中元素的访问即val[score][0]访问score对应0下标的元素 Value append(const Value value); // 向数组中添加元素即val[score].append(88); ArrayIndex size() const; // 获取数组元素个数 val[score].size(); std::string asString() const; // 将‘值’数据转成string型即string name val[name].asString(); const char* asCString() const; // 将‘值’数据转成char*型即char *name val[name].asCString(); Int asInt() const; // 将‘值’数据转成int型即int age val[age].asInt(); float asFloat() const; // 将‘值’数据转成float型即float weight val[weight].asFloat(); bool asBool() const; // 将‘值’数据转成bool型即bool ok val[ok].asBool(); .....这里还可以转换成其它常用数据类型这里不再展示 }; 3-2Json::StreamWriter类 Json::StreamWriter类用于将Json字符串格式的数据序列化该类功能依靠类内部的write函数Json::StreamWriter::write()。但该类是一个抽象类不能实例化出对象该类是通过被Json::StreamWriterBuilder类继承完成序列化的功能。Json::StreamWriterBuilder类是Json::StreamWriter类的工厂类它内部存在newStreamWriter用于动态构建出Json::StreamWriter对象的成员函数。具体形式如下 class JSON_API StreamWriter { virtual int write(Value const root, std::ostream* sout) 0; // 将Json格式的Value对象Json::Value类对象root进行序列化并将其写入到指定输出流对象的地址中成功时该函数返回0失败的情况比较复杂这里不做说明。 } class JSON_API StreamWriterBuilder : public StreamWriter::Factory { virtual StreamWriter* newStreamWriter() const; // 动态开辟出StreamWriter对象 } 3-3Json::CharReader类 Json::CharReader类用于将Json数据格式反序列化。该类的功能是靠成员函数Json::CharReader::parse()实现的。与Json::StreamWriter类一样该类也是一个抽象类通过被Json::CharReaderBuilder类继承完成其实例化具体说明如下 class JSON_API CharReader { virtual bool parse(char const* beginDoc, char const* endDoc, Value* root, std::string* errs) 0; /* beginDoc是指向JSON字符串开始的指针 endDoc是指向JSON字符串结束的指针 root是一个指向Json::Value对象的指针用于存储解析后的JSON数据 errs是一个指向std::string对象的指针用于存储错误信息。 该函数是将一个存储序列化的字符串进行反序列化将其存储到一个指向Value对象的指针中 成功时该函数返回true失败时返回false */ } class JSON_API CharReaderBuilder : public CharReader::Factory { virtual CharReader* newCharReader() const; // 动态开辟出CharReade对象 } Jsoncpp的代码运用请在此链接下观看Jsoncpp的代码运用