c/c++c++json解析和生成的开源库:rapidjson和jsoncpp(代码片段)

拉伊卜 拉伊卜     2023-03-13     278

关键词:

目录

一,RapidJson和JsonCpp对比

二,RapidJson和JsonCpp下载地址

1.RapidJson下载

2.JsonCpp下载

三,RapidJson头文件及其功能介绍

1.rapidjson/document.h

2.rapidjson/writer.h

3.rapidjson/stringbuffer.h

4.rapidjson/reader.h

5.rapidjson/error/en.h

6.rapidjson/error/error.h

四,RapidJson使用案例

1.安装RapidJson

2.测试的Json数据

3.使用DOM解析器解析JSON

4.使用DOM解析器生成JSON

五,JsonCpp使用

六,其它


一,RapidJson和JsonCpp对比

RapidJson和JsonCpp都是C++中流行的JSON解析器和生成器,并且都是开源库,具有许多相似的功能,但也有不同之处。

1.RapidJson优势

  • RapidJSON的速度比JsonCpp更快,因为它使用了更高效的内存管理和解析算法。
  • RapidJSON在内存使用方面比JsonCpp更加高效,因为它使用了基于堆栈的内存池。
  • RapidJSON提供了很多灵活的解析和生成JSON的选项,例如支持按需解析和生成,可以通过模板自定义数据类型的序列化和反序列化等等。
  • RapidJSON代码体积非常小,只有几个头文件和源文件,没有外部依赖,而且只依赖于标准C++库,因此很容易部署到现有项目中,非常轻量级。

2.JsonCpp优势

  • JsonCpp是一个稳定且经过长期使用和测试的库,具有更广泛的社区支持和使用。
  • JsonCpp提供了更加简单的API,易于学习和使用,它的代码结构也很清晰,方便阅读和理解。
  • JsonCpp提供了更多的功能,例如支持JSON格式化,可以在解析时检查语法错误等等。
  • JsonCpp可移植性好,可以在多种操作系统和编译器上运行,包括Windows、Linux和Mac OS X。

3.两者的差异

  • RapidJSON的设计理念更加注重性能,而JsonCpp的设计理念更加注重易用性。
  • RapidJSON提供了更多的可扩展性选项,而JsonCpp则更加易于移植。

4.根据具体需求进行选择

  • 如果你需要一个快速和高效处理大量JSON数据的库,并且愿意使用更灵活的解析和生成选项,那么RapidJSON是一个很好的选择。
  • 如果你需要一个更稳定,易于使用和可移植的库,并且需要额外的功能(例如JSON格式化),那么JsonCpp是一个不错的选择。

二,RapidJson和JsonCpp下载地址

1.RapidJson下载

  1. 开源库地址:https://github.com/Tencent/rapidjson
  2. 开发文档:http://rapidjson.org/zh-cn/ 

2.JsonCpp下载

  1. 开源库地址:https://github.com/open-source-parsers/jsoncpp

三,RapidJson头文件及其功能介绍

1.rapidjson/document.h

该头文件包含了DOM解析器和生成器所需的类和函数。DOM解析器是一种将JSON文本解析为DOM树的解析器,DOM树的结构对应于JSON文本的语法结构。DOM生成器是一种将DOM树转换为JSON文本的生成器。该头文件中的类包括:

  • GenericValue: 一个通用的JSON值类型,可以表示任何类型的JSON值,包括null、bool、int、double、字符串、数组和对象。
  • Document: 表示一个JSON文档,包含一个根节点和相关的配置选项。

2.rapidjson/writer.h

该头文件包含了生成器所需的类和函数,用于将DOM树转换为JSON文本。该头文件中的类包括:

  • Writer: 将DOM树转换为JSON文本的基类。
  • PrettyWriter: 继承自Writer,支持格式化输出的生成器,生成的JSON文本带有缩进和换行符。
  • WriterTraits: 定义了生成器的一些常见特性,如逗号的位置、缩进符号等。

3.rapidjson/stringbuffer.h

该头文件包含了一个字符串缓冲区类,用于存储生成器生成的JSON文本。该头文件中的类包括:

  • StringBuffer: 表示一个字符串缓冲区,提供了向缓冲区写入数据的方法。
  • CrtAllocator: 表示一个内存分配器,用于分配和释放内存。

4.rapidjson/reader.h

该头文件包含了SAX解析器所需的类和函数,用于将JSON文本解析为SAX事件流。SAX解析器是一种将JSON文本解析为SAX事件流的解析器,SAX事件流表示JSON文本的语法结构。该头文件中的类包括:

  • BaseReaderHandler: 解析器事件处理程序的基类。
  • Reader: 将JSON文本解析为SAX事件流的解析器。

5.rapidjson/error/en.h

该头文件包含了RapidJSON的错误码和错误信息的定义。该头文件中的类包括:

  • ParseErrorCode: 定义了解析器可能出现的错误码。
  • GetParseErrorFunc: 用于获取错误码对应的错误信息。

6.rapidjson/error/error.h

该头文件包含了解析器和生成器可能出现的错误异常类的定义。该头文件中的类包括:

  • ParseException: 解析器可能抛出的异常类。
  • RuntimeError: 生成器可能抛出的异常类。

四,RapidJson使用案例

1.安装RapidJson

1.RapidJSON 是只有头文件的 C++ 库,没有安装过程。下载解压后只需把 include/rapidjson 目录拷贝到你的项目中即可开始使用(支持SAX和DOM两种解析方式:SAX解析器将JSON流解析为事件序列,而DOM解析器将JSON解析为内存中的树形结构)

VS2019工程

VsCode工程(参考)

2.测试的Json数据

准备测试读写的 example.json 文件内容(文件路径 E:\\example.json)

  
      "FirstName": "Fu",
      "LastName": "Cong",
      "Age": 24,
      "Address": 
          "Street": "首创悦榕汇",
          "City": "BeiJing",
          "Country": "BeiJing"
      ,
      "Phone numbers": [
          "+44 12345",
          678910
      ]
  

3.使用DOM解析器解析JSON

#include <iostream>
#include <fstream>
#include "rapidjson/document.h"
//返回指定文件的所有内容
char* readFile(std::string path)

    std::ifstream ifs;
    ifs.open(path, ios::in);
    char* data = NULL;
    long length;    //文件大小
    if (ifs.is_open()) 
        //文件打开成功
        ifs.seekg(0, ios::end);  //将文件流光标移动到文件末尾
        length = ifs.tellg();   //获取文件内容的大小(相对于文件开头的位移量来表示)
        data = (char*)malloc((length + 1) * sizeof(char));
        memset(data, '\\0', length);
        ifs.seekg(0, ios::beg);  //将文件光标重置到文件开头位置
        ifs.read(data, length);  //一次性读取所有字符串
        ifs.close();    //关闭文件流
        return data;
    
    return NULL;
void readJson()

    std::string jsonData(readFile("E:\\\\example.json"));

    rapidjson::Document doc;    //Document是一个表示根DOM的JSON值。根可以是对象或数组。
    if(doc.Parse(jsonData.c_str()).HasParseError())
        std::cout << "“正常”解析,解码字符串到新的缓冲区失败!" << std::endl;
        return;
    else
        std::cout << "解析文档成功!" << std::endl;
    
    
     if (doc.IsObject()) 
        //JSON根数据是对象
        if (doc.HasMember("FirstName") && doc["FirstName"].IsString()) 
            std::cout << "FirstName:" << doc["FirstName"].GetString() << std::endl;
        
        if(doc.HasMember("LastName") && doc["LastName"].IsString())
            std::cout << "LastName:" << doc["LastName"].GetString() << std::endl;
        
        if(doc.HasMember("Age") && doc["Age"].IsInt())
            std::cout << "Age:" << doc["Age"].GetInt() << std::endl;
        
        if(doc.HasMember("Address") && doc["Address"].IsObject())
            rapidjson::Value &subObj = doc["Address"].GetObject();
            if(subObj.HasMember("Street") && subObj["Street"].IsString())
                std::cout << "Street:" << subObj["Street"].GetString() << std::endl;
            
            if(subObj.HasMember("City") && subObj["City"].IsString())
                std::cout << "City:" << subObj["City"].GetString() << std::endl;
            
            //从0.2版本开始,可以使用单一查找来检查成员的存在及其值(个人觉得并不好用)
            rapidjson::Value::MemberIterator street = subObj.FindMember("Country");
            if(street != doc.MemberEnd() && street->value.IsString())
                std::cout << "Country:" << street->value.GetString() << std::endl;
            
        
        if(doc.HasMember("Phone numbers") && doc["Phone numbers"].IsArray())
            const rapidjson::Value& arr = doc["Phone numbers"];
            for(rapidjson::SizeType i = 0; i< arr.Size();i++)
                if (arr[i].IsString()) 
                    std::cout << arr[i].GetString() << std::endl;
                
                if (arr[i].IsInt()) 
                    std::cout << arr[i].GetInt() << std::endl;
                
            
        
    else if(doc.IsArray())
        //JSON根数据是数组
    

4.使用DOM解析器生成JSON

#include <iostream>
#include <fstream>
#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"    //存储生成的JSON文本,然后可以轻松地将其输出到文件或其他输出流中
#include "rapidjson/prettywriter.h"    //生成带有格式的JSON文本,并将其输出到文件中
void writeJson()

    rapidjson::Document docRoot;
    docRoot.SetObject();    //创建一个JSON对象

    //加入键值对
    docRoot.AddMember("FirstName","Fu",docRoot.GetAllocator());
    docRoot.AddMember("LastName","Cong",docRoot.GetAllocator());
    docRoot.AddMember("Age",24,docRoot.GetAllocator());

    //添加子对象
    rapidjson::Value subObj(rapidjson::kObjectType);
    subObj.AddMember("Street","首创悦榕汇",docRoot.GetAllocator());
    subObj.AddMember("City","BeiJing",docRoot.GetAllocator());
    subObj.AddMember("Country","BeiJing",docRoot.GetAllocator());
    docRoot.AddMember("Age",subObj,docRoot.GetAllocator());

    //添加数组
    rapidjson::Value PhoneNumber(rapidjson::kArrayType);
    rapidjson::Value val1;
    val1.SetString("+44 12345", docRoot.GetAllocator());
    PhoneNumber.PushBack(val1,docRoot.GetAllocator());
    rapidjson::Value val2;
    val2.SetInt(678910);
    PhoneNumber.PushBack(val2,docRoot.GetAllocator());
    docRoot.AddMember("Phone numbers",PhoneNumber,docRoot.GetAllocator());

    //输出到Json文件中
    rapidjson::StringBuffer buffer;     //创建一个StringBuffer对象
    // rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);  //创建一个Writer对象并将其与StringBuffer对象连接起来,生成不带有格式的JSON文本
    rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(buffer);    //创建一个PrettyWriter对象并将其与StringBuffer对象连接起来,生成带有格式的JSON文本
    docRoot.Accept(writer);     //将JSON对象写入StringBuffer对象
    std::string json_str = buffer.GetString();      //将StringBuffer对象转换为std::string
    
    std::ofstream ofs;
    ofs.open("E:\\\\example.json",std::ios::out);
    if(ofs.is_open())
        ofs << json_str;
        ofs.close();
    

五,JsonCpp使用

参考这篇文章: JsonCpp编译和使用 | 爱编程的大丙

六,其它

cJSON的使用 :cJSON的API介绍和使用

吐血整理:c++编程语言资源汇总丨第二弹

...符编码之间的编码转换库Jasonfrozen :C/C++的Jason解析生成器Jansson :进行编解码和处理Jason数据的C语言库jbson :C++14中构建和迭代BSONdata,和Json文档的库JeayeSON:非常健全的C++JSON库,只包含头... 查看详情

如何生成和解析json格式数据

...想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,json生成的数据量比XML还要少一些,所以很多公司传输数据喜欢用JSON数据格式。1、下面通过一个简单的例子来说明JSON的解析StringstrJson="\"students\... 查看详情

c++使用tinyxml(开源库)读取*.xml文件(代码片段)

...设置xml配置文件是我们最常用的操作。常见C/C++XML解析器有Tinyxml、XERCES、squashxml、xmlite、pugxml、libxml等等,这些解析器有些是支持多语言的,有些只是单纯C/C++的。TinyXML是目前非常 查看详情

c/c++开发人员要了解的几大著名c/c++开源库

目录1、多媒体处理开源库FFmpeg2、实时音视频处理开源库WebRTC3、Chrome浏览器内核开源库Chromium4、Chromium嵌入式框架开源库CEF5、多协议网络传输开源库libcurl 6、开源操作系统ReactOS7、开源多媒体播放器VLC8、最后    在开源软件盛... 查看详情

json介绍

...级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLanguage, StandardECMA-2623rdEdition-December1999的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包... 查看详情

用于c/c++应用程序的开源pdf库?[关闭]

我希望能够从我的(本机)C++Windows应用程序生成PDF输出。有没有可用的免费/开源库?我查看了thisquestion的答案,但它们主要与.Net有关。答案LibHaruHaru是一个免费的跨平台开源软件库,用于生成用ANSI-C编写的PDF。它既可以作为静... 查看详情

rsa算法的jni封装思路

...封装实现签名等功能。封装步骤如下:1、使用java编译器生成调用RSA加解密,签名验签的API头文件。2、根据生成的头文件和RSA的C源码库开源库,生成一个供JNI接口调用的静态库3、在JAVA源码中使用Native方法引入动态库的API,编译... 查看详情

向量化数学函数的免费/开源 C/C++ 库? [关闭]

】向量化数学函数的免费/开源C/C++库?[关闭]【英文标题】:Free/opensourceC/C++libraryofvectorizedmathfunctions?[closed]【发布时间】:2011-07-3111:25:36【问题描述】:我正在寻找一个免费/开源C/C++(任何一个都可以)库,该库包含常见数学函... 查看详情

python调用c/c++

...+实现程序。将C/C++程序编译成动态库。在Python中调用编译生成的库。python在调用C/C++程序时有一些不同,需要注意。##原生态实现###pyt 查看详情

有哪些好用的c++json库?

...这个)RapidJSONRapidJSON是一个快速、高效的C++JSON解析器和生成器,支持SAX和DOM两种解析模式。它的设计目标是提供一个快速、安全、易于使用的JSON库。JSONforModernC++JSONforModernC++是一个现代化、易于使用的C... 查看详情

pythonjson模块

...级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLanguage,StandardECMA-2623rdEdition-December1999的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C,C+... 查看详情

开源免费的c/c++网络库(c/c++socketslibrary)

(1)ACE庞大、复杂,适合大型项目。开源、免费,不依赖第三方库,支持跨平台。http://www.cs.wustl.edu/~schmidt/ACE.html (2)AsioAsio基于Boost开发的异步IO库,封装了Socket,简化基于socket程序的开发。开源、免费,支... 查看详情

c/c++关于cjson库的使用(代码片段)

...需要针对不同的语言使用不同的库对Json格式的数据进行解析,下面给大家介绍一个基于C语言的Json库–cJson。cJSON是一个超轻巧,携带方便,单文件,简单的可以作为ANSI-C标准的JSON解析器。cJSON是一个开 查看详情

freecplus框架简介(代码片段)

...术网组织开发、维护。其目的是为C/C++程序员供免费的、开源的程序库。freecplus框架与C++标准库结合使用,可以极大的提高程序员的开发效率。freecplus框架的初衷是为C/C++程序员提供功能强大、简单易用的函数和类,把程序员从... 查看详情

json数据格式c语言解析库(cjson)的使用&在stm32上移植和使用(代码片段)

目录轻量级C语言JSON解析库1.JSON与cJSONJSON——轻量级的数据格式JSON语法规则cJSON2.cJSON数据结构和设计思想3.JSON数据封装封装方法输出JSON数据封装数据和打印数据示例4.cJSON数据解析解析方法解析示例注意事项5.cJSON使用过程中的内... 查看详情

ios开源json解析库mjextension

参考技术AiOS中JSON与NSObject互转有两种方式:1、iOS自带类NSJSONSerialization2、第三方开源库SBJSON、JSONKit、MJExtension。项目中一直用MJExtension来进行JSON与Model的互转,非常方便、强大,接下来介绍一下这个轻量、强大的开源库。1、什... 查看详情

jason

...量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成。它基于ECMA262语言规范(1999-12第三版)中JavaScript编程语言的一个子集。JSON采用与编程语言无关的文本格式,但是也使用了类C语言(包括C,C+ 查看详情

json的生成和解析

json是常见的数据格式,生成和解析是常用的操作。Android中,默认提供orgJson供我们使用,除此之外,google也提供了Gson库方便我们开发。Json样例类packagecom.fxb.jsontest;importandroid.content.Context;importandroid.util.Log;importandroid.widget.Toast;impor... 查看详情