【探索Linux】P.30(序列化和反序列化 | JSON序列化库 [ C++ ] )

2024-04-08 1392阅读

温馨提示:这篇文章已超过387天没有更新,请注意相关的内容是否还可用!

【探索Linux】P.30(序列化和反序列化 | JSON序列化库 [ C++ ] )

阅读导航

  • 引言
  • 一、序列化反序列化概念
  • 二、各种语言序列化反序列化常用库
  • 三、C++的JSON序列化库
    • 1. RapidJSON库
      • (1)头文件
      • (2)相关函数
      • (3)参数
        • (4)特点
        • (5)使用示例
          • ⭕解析JSON字符串
          • ⭕生成JSON字符串:
          • 2. nlohmann/json库
            • (1)头文件
            • (2)相关函数
            • (3)参数
            • (4)特点
            • (5)使用示例
              • ⭕序列化为JSON
              • ⭕反序列化JSON字符串
              • 3. jsoncpp库
                • (1)头文件
                • (2)相关函数
                • (3)参数
                • (4)特点
                • (5)使用示例
                  • ⭕解析JSON字符串
                  • ⭕生成JSON字符串
                  • 温馨提示

                    引言

                    当谈到网络编程时,序列化和反序列化是非常重要的概念。在上一篇文章中,我们已经了解了在Linux环境下实现简单的TCP网络程序的基础知识。本文将继续探讨序列化和反序列化,这些概念对于在网络上传输数据以及跨网络通信至关重要。通过深入了解序列化和反序列化,我们将能够更好地理解如何在网络编程中有效地处理数据。让我们一起深入探讨序列化和反序列化的重要性以及实际应用!

                    一、序列化反序列化概念

                    在计算机科学中,序列化(Serialization)和反序列化(Deserialization)是指将数据结构或对象转换为一种特定格式,以便在网络上传输或存储到磁盘中,然后在需要的时候将其重新恢复成原始的数据结构或对象的过程。

                    • 序列化(Serialization):序列化是将数据结构或对象转换为一个线性的字节流或文本表示的过程。序列化后的数据可以被传输到网络上的其他计算机、存储到磁盘上或者在内存中保存。序列化通常用于数据持久化或网络通信,以便在不同系统之间交换数据。

                    • 反序列化(Deserialization):反序列化是对序列化后的数据进行解析和重建原始数据结构或对象的过程。通过反序列化,可以从序列化的数据中还原出原始的对象或数据结构,使其可以在程序中继续使用或处理。

                      序列化和反序列化是实现数据持久化、跨网络通信、跨平台数据交换等功能的重要技术手段。常见的序列化格式包括 JSON、XML、Protocol Buffers 等,不同的序列化方式适用于不同的场景和需求。

                      二、各种语言序列化反序列化常用库

                      在很多编程语言和框架中,都提供了现成的函数或库来实现数据的序列化和反序列化操作,以简化开发者的工作。以下是一些常见的编程语言和对应的序列化库:

                      1. Python:

                        • JSON:Python 的标准库中提供了 json 模块,可以用于将 Python 对象序列化为 JSON 格式或将 JSON 字符串反序列化为 Python 对象。
                        • Pickle:Python 的标准库中也提供了 pickle 模块,可以用于将 Python 对象序列化为字节流或文件,实现更高级的数据序列化功能。
                        • Java:

                          • Jackson:Jackson 是一个流行的 Java 序列化库,可以实现 Java 对象和 JSON 数据之间的转换。
                          • Gson:Gson 是另一个常用的 Java 序列化库,可以帮助将 Java 对象序列化为 JSON 格式或反序列化 JSON 数据为 Java 对象。
                          • C#:

                            • Json.NET:Json.NET(Newtonsoft.Json)是 C# 中广泛使用的 JSON 序列化库,可用于将对象序列化为 JSON 或反序列化 JSON 为对象。
                            • Protobuf-net:Protobuf-net 是 C# 版本的 Protocol Buffers 库,提供了 ProtoBuf 格式的序列化和反序列化功能。

                      三、C++的JSON序列化库

                      JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于数据传输和配置文件。在C++开发中,有几个常见的JSON库可用:

                      1. RapidJSON:一个高性能的C++ JSON解析/生成库,使用简单且功能强大。

                      2. nlohmann/json:一个现代化的C++ JSON库,具有简洁的API和直观的语法。

                      3. jsoncpp:一个开源的C++ JSON库,易于集成和使用。

                      这些库都提供了解析JSON字符串和生成JSON字符串的功能,可以方便地操作JSON数据。选择适合项目需求和个人喜好的库,可以更快速、高效地处理JSON数据。下面我们会详细介绍这三个库

                      1. RapidJSON库

                      (1)头文件

                      • 解析和生成JSON数据的主要头文件为rapidjson/document.h、rapidjson/writer.h和rapidjson/stringbuffer.h。

                        (2)相关函数

                        • 解析JSON字符串:Document::Parse(const Ch* str)
                        • 生成JSON字符串:Writer::String(const Ch* str)

                          (3)参数

                          • Document::Parse(const Ch* str):接受一个JSON字符串作为输入参数。
                          • Writer::String(const Ch* str):接受一个字符串作为输入参数。
                            (4)特点
                            • 高性能:RapidJSON具有极快的解析和生成速度,适合处理大规模JSON数据。
                            • 低内存占用:内存效率高,可以在资源受限的环境中使用。
                            • 支持标准:符合JSON标准,支持JSON文档的解析和生成。

                              (5)使用示例

                              ⭕解析JSON字符串
                                   #include 
                                   using namespace rapidjson;
                                   const char* json = "{\"name\":\"John\", \"age\":30}";
                                   Document document;
                                   document.Parse(json);
                                   // 访问解析后的值
                                   const Value& name = document["name"];
                                   const Value& age = document["age"];
                                   assert(name.IsString());
                                   assert(age.IsInt());
                                   // 获取值
                                   std::string nameValue = name.GetString();
                                   int ageValue = age.GetInt();
                              
                              ⭕生成JSON字符串:
                                   #include 
                                   #include 
                                   #include 
                                   using namespace rapidjson;
                                   StringBuffer buffer;
                                   Writer writer(buffer);
                                   // 开始生成对象
                                   writer.StartObject();
                                   // 添加键值对
                                   writer.Key("name");
                                   writer.String("John");
                                   writer.Key("age");
                                   writer.Int(30);
                                   // 结束生成对象
                                   writer.EndObject();
                                   // 获取生成的JSON字符串
                                   std::string json = buffer.GetString();
                              

                              2. nlohmann/json库

                              (1)头文件

                              • nlohmann/json库的头文件为#include 。

                                (2)相关函数

                                • 序列化为JSON:json::dump()
                                • 反序列化JSON字符串:json::parse()

                                  (3)参数

                                  • json::dump(): 无需额外参数,将JSON对象序列化为JSON字符串。
                                  • json::parse(): 接受一个JSON字符串作为输入参数,将其解析为JSON对象。

                                    (4)特点

                                    • 简洁易用:nlohmann/json提供简洁的API和直观的语法,使JSON操作变得简单。
                                    • 高级功能:支持自定义序列化和反序列化,以及方便的JSON查询和操作方法。
                                    • 跨平台性:支持多种操作系统和编译器,具有良好的跨平台性能。

                                      (5)使用示例

                                      ⭕序列化为JSON
                                           #include 
                                           using json = nlohmann::json;
                                           // 创建一个JSON对象
                                           json jsonObj;
                                           jsonObj["name"] = "John";
                                           jsonObj["age"] = 30;
                                           // 序列化为JSON字符串
                                           std::string jsonString = jsonObj.dump();
                                      
                                      ⭕反序列化JSON字符串
                                           #include 
                                           using json = nlohmann::json;
                                           std::string jsonString = "{\"name\":\"John\", \"age\":30}";
                                           // 反序列化为JSON对象
                                           json jsonObj = json::parse(jsonString);
                                           // 访问值
                                           std::string name = jsonObj["name"].get();
                                           int age = jsonObj["age"].get();
                                      

                                      3. jsoncpp库

                                      (1)头文件

                                      • jsoncpp库的主要头文件为#include 。

                                        (2)相关函数

                                        • 解析JSON字符串:Reader::parse(const std::string &json, Value &root)
                                        • 生成JSON字符串:StyledWriter::write(const Value &root)

                                          (3)参数

                                          • Reader::parse(const std::string &json, Value &root): 接受一个JSON字符串和一个Json::Value对象作为输入参数。
                                          • StyledWriter::write(const Value &root): 接受一个Json::Value对象作为输入参数。

                                            (4)特点

                                            • 开源:jsoncpp是开源项目,可以自由获取并在各种项目中使用。
                                            • 容易集成:易于集成到现有项目中,并与标准C++容器进行交互。
                                            • 跨平台支持:具有良好的跨平台性能,可在不同平台上使用。

                                              (5)使用示例

                                              ⭕解析JSON字符串
                                                   #include 
                                                   const char* json = "{\"name\":\"John\", \"age\":30}";
                                                   Json::Value root;
                                                   Json::Reader reader;
                                                   bool parsingSuccessful = reader.parse(json, root);
                                                   if (parsingSuccessful) {
                                                       std::string name = root["name"].asString();
                                                       int age = root["age"].asInt();
                                                   }
                                              
                                              ⭕生成JSON字符串
                                                   #include 
                                                   Json::Value root;
                                                   root["name"] = "John";
                                                   root["age"] = 30;
                                                   Json::StyledWriter writer;
                                                   std::string jsonString = writer.write(root);
                                              

                                              根据项目需求和个人偏好,选择适合的JSON库可以提高开发效率和代码质量。例如,如果需要处理大量JSON数据且要求高性能,可以选择RapidJSON;如果更注重简洁的API和易用性,可以考虑使用nlohmann/json;而如果希望能够轻松地与标准C++容器交互,jsoncpp可能是一个不错的选择。希望这些信息能够帮助您更好地了解每个JSON库的优势和特点。

                                              温馨提示

                                              感谢您对博主文章的关注与支持!如果您喜欢这篇文章,可以点赞、评论和分享给您的同学,这将对我提供巨大的鼓励和支持。另外,我计划在未来的更新中持续探讨与本文相关的内容。我会为您带来更多关于Linux以及C++编程技术问题的深入解析、应用案例和趣味玩法等。如果感兴趣的话可以关注博主的更新,不要错过任何精彩内容!

                                              再次感谢您的支持和关注。我们期待与您建立更紧密的互动,共同探索Linux、C++、算法和编程的奥秘。祝您生活愉快,排便顺畅!

                                              【探索Linux】P.30(序列化和反序列化 | JSON序列化库 [ C++ ] )

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]