02rapidJson学习之数组的创建、遍历

2023-11-15

02rapidJson学习之数组的创建、遍历

概述:
创建数组时我们需要注意以下内容:

1)不能直接返回数组,我试过不行,因为数组必须依赖某一对象.即若我们不将数组添加到doc上,而直接返回数组是不行的。

1 数组的创建

//从doc中获取string字符串内容
std::string GetStrWithDoc(Document &doc){
    rapidjson::StringBuffer buffer;//画板
	rapidjson::Writer<StringBuffer> writer(buffer);//画家交给画板
	doc.Accept(writer);//利用画家将doc的内容画进画板

	return buffer.GetString();
}

/*
    在doc中创建数组.

    注:不能直接返回数组,我试过不行,因为数组必须依赖某一对象.
    即若我们不将数组添加到doc上,而直接返回数组是不行的.
*/
void RapidCreateArr(Document &doc){
    //1 设置对象和获取分配器,防止组装json格式出错
    doc.SetObject();
    Document::AllocatorType& a = doc.GetAllocator();

    //2 创建数组,必须声明枚举为数组类型
    Value a1(kArrayType);

    //3 这里简单循环添加int,一般数组里面都是循环添加多个对象
    for(auto i = 0; i < 5; i++){
        a1.PushBack(i, a);
    }
    //可以连续创建,因为返回的是引用
    a1.PushBack("C++11", a).PushBack("C++14", a);
    
    //4 必须将数组绑定到某一对象返回,这里是doc
    doc.AddMember("data", a1, a);
}

//在doc创建数组
void test02(){
    rapidjson::Document doc;
    RapidCreateArr(doc);
    std::string str= GetStrWithDoc(doc);

	std::cout<< str <<std::endl;
}

执行上面程序结果如下:
在这里插入图片描述

2 数组的遍历
数组的遍历有三种,第一种是利用内部SizeType(实际为uint)类型的下标;第二种是利用迭代器;第三种是利用C++11新特性auto。创建数组的函数RapidCreateArr上面已经有了,所以下面不再拷贝了。
1)SizeType下标遍历。

//数组的遍历-下标
void test03(){
    rapidjson::Document doc;
    RapidCreateArr(doc);

    //利用上面的函数创建数组后,就可以进行遍历
    //1 先判断data成员是否存在并且要求为数组类型
    if(!(doc.HasMember("data") && doc["data"].IsArray())){
        std::cout << "数组data不存在或者data不是数组类型" << std::endl;
        return;
    }

    //2 开始遍历
    const Value &a1 = doc["data"];//先获取数组
    for(SizeType i = 0; i < a1.Size(); i++){
        if(a1[i].IsInt()){
            //一般这里会再与自己的数据比较然后作业务处理
            std::cout << a1[i].GetInt() << " ";
        }
        else if(a1[i].IsString()){
            std::cout << a1[i].GetString() <<" ";
        }else{
            //其它类型按照这样判断即可
        }
    }
    std::cout<<std::endl;
}

2)迭代器的遍历。

//数组的遍历-迭代器
void test04(){
    rapidjson::Document doc;
    RapidCreateArr(doc);

    //利用上面的函数创建数组后,就可以进行遍历
    //1 先判断data成员是否存在并且要求为数组类型
    if(!(doc.HasMember("data") && doc["data"].IsArray())){
        std::cout << "数组data不存在或者data不是数组类型" << std::endl;
        return;
    }

    //2 开始遍历
    const Value &a1 = doc["data"];//先获取数组
    //Value::ConstValueIterator为通用Value类型的迭代器
    for (Value::ConstValueIterator it = a1.Begin(); it != a1.End(); it++){
        if(it->IsInt()){
            std::cout << it->GetInt()<< " ";
        }else if(it->IsString()){
            std::cout << it->GetString() << " ";
        }else{
            //
        }
    }
    std::cout<<std::endl;
}

3)C++11新特性。

//数组的遍历-C++11新特性
void test05(){
    rapidjson::Document doc;
    RapidCreateArr(doc);

    //利用上面的函数创建数组后,就可以进行遍历
    //1 先判断data成员是否存在并且要求为数组类型
    if(!(doc.HasMember("data") && doc["data"].IsArray())){
        std::cout << "数组data不存在或者data不是数组类型" << std::endl;
        return;
    }   

    //2 开始遍历
    const Value &a1 = doc["data"];//先获取数组
    //x的值为a数组依次的元素,注意x必须获取的是引用,这就是rapid高效的地方,基本不支持拷贝赋值
    for(auto &x:a1.GetArray()){
        if(x.IsInt()){
            std::cout << x.GetInt()<< " ";
        }else if(x.IsString()){
            std::cout << x.GetString() << " ";
        }else{
            //
        }
    }
    std::cout<<std::endl;
}

主函数很简单,顺便也列一下吧。

int main(){

	//test01();

    //test02();

    //test03();

    //test04();

    test05();

	return 0;
}

上面3种遍历后的结果都是一样的:
在这里插入图片描述

搞定rapidjson的数组创建,很简单,容易出错的地方在rapidjson第一节初始化已经总结了。我们创建数组只需要注意上面的概述即可,即不能直接返回数组。
下一节将讲述kObjectType的创建与遍历。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

02rapidJson学习之数组的创建、遍历 的相关文章

随机推荐

  • Mysql字符串处理函数详细介绍、总结

    1 ASCII str 返回字符的 ASCII 码值 返回值为字符串str 的最左字符 第一个字符 的数值 即取得最左字符的 ascii 码 假如str 为空字符串 则返回值为 0 假如 str 为 NULL 则返回值为 NULL ASCI
  • unity 不显示UI项,代码无法引用UI类

    如果在unity项目中遇到在Hierarchy面板右键发现没有ui这个选项 在vs里无法引用到UI类时可以进行以下操作 1 可以在unity的Project面板 选中Assets文件夹 右键选择 show in Explorer选项 开打资
  • vue3.0 新的api属性

    vue3 0 只需要升级vuecli4 0以上的版本就可以选择性的安装了 获取路由对象 import useRouter from vue router const router useRouter router push 即可调用路由跳转
  • 【转载】国内主要的量化交易平台及链接

    Bigquant 掘金 优矿 万矿 聚宽 米筐 真格 镭矿 量化云 点宽等 附 网站网址 Bigquant https bigquant com 掘金 https www myquant cn 优矿 https uqer io v3 com
  • java基础 基本包装类 System Math Array BigInteger BigDecimal

    基本类型包装类 1 1 基本类型包装类概述 在实际程序使用中 程序界面上用户输入的数据都是以字符串类型进行存储的 而程序开发中 我们需要把字符串数据 根据需求转换成指定的基本数据类型 如年龄需要转换成int类型 考试成绩需要转换成doubl
  • 面试题 08.08. 有重复字符串的排列组合--回溯算法

    LeetCode 面试题 08 08 有重复字符串的排列组合 有重复字符串的排列组合 编写一种方法 计算某字符串的所有排列组合 示例1 输入 S qqe 输出 eqq qeq qqe 示例2 输入 S ab 输出 ab ba 解法 回溯法
  • 二分查找及二分答案

    一 二分思想 二分是一种常用且非常精妙的算法 常常是我们解答问题的突破口 二分的基本用途是在单调序列或单调函数中做查找操作 因此当问题的答案具有单调性时 就可以通过二分把求解转化为判定 根据复杂度理论 可知判定的难度小于求解 这使得二分的应
  • (优雅的使用)matlab脚本编程习题2

    matlab脚本编程习题2 输入一个四位整数 求出各位数字之和 如果该和能被3整除 输出 这个数可以被3整除 否则输出 这个数不可以被3整除 num input input the four digit integer n A zeros
  • C++解析xml(使用tinyxml)

    环境是vs2010 Windows 7 timyxml库我是在这里下载的 直接就能编译 编译后得到tinyxml lib 使用时当然也需要tinyxml h文件 如果不想编译 这里能下载我编译好的lib 顺便附赠h文件 我程序中解析的xml
  • 【计组】学习笔记1.1:8421码和ASCII码

    8421码 8421码即BCD码 由于人们习惯日常使用十进制数 而计算机处理时使用的是二进制数 而两种数制相互转换十分麻烦 因此产生了8421码映射关系 其映射运算例如 1001转化为十进制数9 1 8 0 4 0 2 0 1 8 0 0
  • python算法中的机器学习算法之半监督学习和强化学习(详解)

    目录 学习目标 学习内容 1 半监督学习 Semi Supervised Learning 基于图的半监督学习
  • 编码器计数原理与电机测速原理——多图解析

    编码器 是一种用来测量机械旋转或位移的传感器 它能够测量机械部件在旋转或直线运动时的位移位置或速度等信息 并将其转换成一系列电信号 编码器分类 按监测原理分类 光电编码器 光电编码器 是一种通过光电转换将输出轴上的机械几何位移量转换成脉冲或
  • 使用Pycharm,tensorflow1.13.1中的keras等库出现cannot find declaration to go to的问题

    使用Pycharm tensorflow1 13 1中的keras等库出现cannot find declaration to go to的问题 使用Pycharm编写python程序 import numpy os 使用ctrl 鼠标左键
  • python编译成c代码_cython编译Python为c语言

    第一种办法 执行命令 cython test py 结果 会在同一目录下面生成test c文件 执行命令 gcc c fPIC I usr include python2 7 test c 结果 在同一目录下面生成test o文件 执行命令
  • Windows下Apache Tomcat 8安装配置

    1 环境配置 1 安装好jar jdk文件包 jdk1 8 0 66与jre1 8 0 66 打开我的电脑 属性 高级 环境变量 新建系统变量JAVA HOME 和CLASSPATH 变量名 JAVA HOME 变量值 C Program
  • vue调用高德地图实现定位

    vue调用高德地图实现定位 第一步创建高德地图key 第二步 下载vue amap npm install vue amap save 第三步 在项目main js引入vue amap import AMap from vue amap V
  • RedmiBook pro15 2023款折腾笔记(7840HS)amd-pstat解决APU睿频问题

    这里记录一下RedmiBook pro15 2023款笔记本 7840HS 搭建ubuntu 22 04系统的记录 留给正好需要在这个笔记本上安装linux环境的童鞋参考一下 其他AMD的APU都是类似的 拿到机器过后安装ubuntu 22
  • 操作系统终端输入大小限制

    问题描述 使用c 写算法题时 测试用例是一个长字符串 上万字符 但运行结果显示字符串读入的长度远远小于输入长度 并且不同操作系统下面显示出了不同的bug macos 输入字符串长度只有1000 超过这个长度成都就会卡在cin那行代码 ubu
  • 裸片IC的简单介绍以及裸片IC的封装设计

    最近项目一直用到一种比较旧的PCB生产工艺 裸片IC 也就是绑定的工艺 1 什么是裸片IC 裸片既是在加工厂生产出来的芯片 即是晶圆经过切割测试后没有经过封装的芯片 大小一般在几毫米左右 边上有用于连接金属线的的焊盘或者小孔 金属线这是连接
  • 02rapidJson学习之数组的创建、遍历

    02rapidJson学习之数组的创建 遍历 概述 创建数组时我们需要注意以下内容 1 不能直接返回数组 我试过不行 因为数组必须依赖某一对象 即若我们不将数组添加到doc上 而直接返回数组是不行的 1 数组的创建 从doc中获取strin