rapidjson查询操作基本用法
博客搬家,原地址:https://langzi989.github.io/2017/05/27/rapidjson查询操作基本用法/
本系列文章以例子的方式进行呈现。
#include "rapidjson/document.h"
#include <iostream>int main()
{const char* test = "{\"num\":123, \"hello\":null, \"type\": \"object\",\"properties\": {\"oid\": {\"type\": \"string\"}, \"username\": {\"type\": \"string\"},\"creid\": {\"type\": \"string\"}},\"required\": [\"oid\", \"username\",\"creid\"]}";rapidjson::Document document;//Parse(const char*). 从c-string解析为Document json格式document.Parse(test);//GetString().从Document json中取出stringstd::cout << "type = " << document["type"].GetString() << std::endl;/* 函数原型 函数功能* IsNull() 判断当前键对应的值是不是null* IsNumber() 判断当前键对应的值是不是number* IsInt() 判断当前键对应的值是不是int* IsDouble() 判断当前键对应的值是不是double* IsString() 判断当前键对应的值是不是string* IsBool() 判断当前键对应的值是不是bool* IsArray() 判断当前键对应的值是不是array* ...*/std::cout << "hello is " << (document["hello"].IsNull() ? "null" : "not null") << std::endl;std::cout << "num is " << (document["num"].IsNumber() ? "number" : "not number") << std::endl;std::cout << "required is " << (document["required"].IsArray()? "array" : "not array") << std::endl;/* 访问Array的两种方法* 1. 通过下标访问 //使用引用来连续访问,方便之余还更高效。* 2. 通过迭代器访问* 注意问题* 1.索引使用SizeType类型,而不是size_t类型,缺省情况下,SizeType是unsigned的typedef* 2.对于String类型使用GetInt是非法的,这个时候会导致程序崩溃*/const rapidjson::Value &a = document["required"];assert(a.IsArray());for (rapidjson::SizeType i = 0; i < a.Size(); i++)std::cout << a[i].GetString() << std::endl;for (rapidjson::Value::ConstValueIterator it = a.Begin(); it != a.End(); it++) {std::cout << it->GetString() << std::endl;std::cout << it->GetStringLength() << std::endl;}/* 访问object的方法* 1.使用迭代器进行访问* 2.使用键对应的下标进行当问 如:document["required"]* 注意问题* 1.在使用下标访问之前,最好先调用HasMember()检查一下当前键是否存在,若存在再往下继续。否则会出现段错误。*/static const char* kTypeNames[] = {"Null", "False", "True", "Object", "Array", "String", "Number"};for (rapidjson::Value::ConstMemberIterator it = document.MemberBegin();it != document.MemberEnd(); it++) {std::cout << it->name.GetString() << " is type : " << kTypeNames[it->value.GetType()] << std::endl;;}/* 查询Number* 说明:Json只提供一种数值类型---Number。Number可以是实数也可以是整数* Dom提供了5中数值类型。包括unsigned,int,uint_64,int_64,double* 类型检查 数值提取* IsUint() GetUint()* IsInt() GetInt()* IsUint64() GetUint64()* IsInt64() GetInt64()* IsDouble() GetDouble()** 查询String* 说明:除了getString(), Value类也有一个GetStringLength();原因是rapidjson的String需要支持Unicode字符,如\u0000.问题是C/C++字符串是* 空字符结尾的字符串,,这种字符串会把'\0'作为结束符号。为了符合RFC4627,若要处理这些带有unicode的字符串,* 需要使用GetStringLength获取正确的字符串长度* 函数 功能* const char* getString() 获取C字符串* SizeType GetStringLength()const 获取字符串的长度,*/rapidjson::Document d1;d1.Parse("{\"s\":\"a\\u0000b\", \"num\":123}");std::cout << d1["s"].GetString() << std::endl;std::cout << d1["s"].GetStringLength() << std::endl;std::cout << strlen(d1["s"].GetString()) << std::endl;/** 比较两个Value的值* 1.使用==和!=比较两Value的值,当且仅当两个Value的类型和内容相等才算相等。* 2.可以将Value与原始值进行比较* 3.若被比较的两个Value的类型不同,直接返回false。* 4.可以比较不同Object的值*/std::cout << (document["num"] == document["hello"]) << std::endl;std::cout << (document["num"] == d1["num"]) << std::endl;/** 创建/修改值* 1.改变Value的类型:当使用默认构造函数创建一个Value或者Document的时候,它的类型默认为* NULL,要改变其类型,使用SetXXX()。如* rapidjsons::Document d;* d.SetObject(); //将d的类型修改为Object* rapidjson::Value v;* v.SetInt(1); //或者v = 1;* 2.构造函数的重载* rapidjson::Value b(false);* rapidjson::Value n(10);** 3.特别注意Value的转移语义。 Value重载operator=()时使用了转移语义。* rapidjson::Value a(123);* rapidjson::Value b(456);* a = b; //此时b变为null,a为456* 4.使用move()函数实现函数参数中的转移语义* rapidjson::Value a(0);* test(a.move());**/rapidjson::Value testa(10);rapidjson::Value testb(10);testa = testb;std::cout << testa.GetInt() << std::endl;if (testb.IsNull()){std::cout << "testb is moved to a, and now testb is null" << std::endl;}else{std::cout << testb.GetInt() << std::endl;}/** 创建String* rapidjson提供两种string的存储策略:* 1.copy-string(深拷贝):分配缓冲区,然后把来源数据复制至它* 2.const-string(浅拷贝):简单的存储字符串指针* 说明:* 1.copy-string总是安全的,因为它拥有数据的克隆* 2.当数据源发生改变,const-string中的数据也会受到影响* 上面两种字符串的创建方式:* 1.copy-string创建方式需要给API传递一个Allocator参数,这个做法避免了给每一个* Value都保存一个Allocator。另外还需要一个length参数,保存长度信息,故* 此函数可以处理带有空字符的字符串。* 2.const-string创建方式不需要长度信息和Allocator参数,它默认字符串以\0结束.* 一般用于常量字符串或者具有安全生存周期的字符串上*/rapidjson::Value autor;char buffer[50];int len = sprintf(buffer, "%s %s", "Milo", "Yip");autor.SetString(buffer,len, document.GetAllocator());memset(buffer, 0x0, sizeof(buffer));std::cout << autor.GetString() << std::endl;rapidjson::Value testString;testString = "testString";std::cout << testString.GetString() << std::endl;/** 修改Array* 函数 功能* clear() 清空Array中的内容* Reserve(SizeType, Allocator&) 申请指定大小空间,单不插入数据* Value& PushBack(Value&, Allocator&) 添加元素* template <typename T> GenericValue& PushBack(T, Allocator&) 添加元素* Value& PopBack() 删除最后一个元素* ValueIterator Erase(ConstValueIterator pos) 删除指定位置元素* ValueIterator Erase(ConstValueIterator first, ConstValueIterator last) 删除指定范围元素*/rapidjson::Value testArray(rapidjson::kArrayType);rapidjson::Document::AllocatorType& testAllocator = document.GetAllocator();for (int i = 0; i < 5; i++){testArray.PushBack(i, testAllocator);}testArray.PushBack("lua", testAllocator).PushBack("Mio", testAllocator);for (rapidjson::SizeType i = 0;i < 5; i++)std::cout << testArray[i].GetInt() << std::endl;std::cout << testArray[5].GetString() << std::endl;std::cout << testArray[6].GetString() << std::endl;/* 修改Object* 说明:每个Object都是键值对的集合。每个键必须为String。* 添加成员的函数:* 1.Value& AddMember(Value&, Value&, Allocator& allocator)* 2.Value& AddMember(StringRefType, Value&, Allocator&)* 3.template <typename T> Value& AddMember(StringRefType, T value, Allocator&)** 补充说明:1.使用StingRefType作为name参数的重载版本与字符串的SetString()类似。这些重载是为了避免复制name字符串* 因为jsonObject中经常会使常数键名。* 2.如果你需要从非常数字符串或者生命周期不足的字符串创建键名,需要使用copy-string API。* 为了避免中间变量,可以使用临时值** 移除成员函数:* 1.bool RemoveMember(const Ch* name):使用键名来移除成员(线性时间复杂度)。* 2.bool RemoveMember(const Value& name):除了 name 是一个 Value,和上一行相同。* 3.MemberIterator RemoveMember(MemberIterator):使用迭代器移除成员(_ 常数 _ 时间复杂度)。* 4.MemberIterator EraseMember(MemberIterator):和上行相似但维持成员次序(线性时间复杂度)。* 5.MemberIterator EraseMember(MemberIterator first, MemberIterator last):移除一个范围内的成员,维持次序(线性时间复杂度)。*/rapidjson::Value contact(rapidjson::kObjectType);contact.AddMember("name", "milo", document.GetAllocator());contact.AddMember("married", false, document.GetAllocator());std::cout << "contact[name] is:"<<contact["name"].GetString() << std::endl;std::cout << "contact[married] is:" << contact["married"].GetBool() << std::endl;contact.AddMember(rapidjson::Value("copy", document.GetAllocator()).Move(), // copy stringrapidjson::Value().Move(), // null valuedocument.GetAllocator());/* 深复制Value* 方法:* 1.含有Allocator的构造函数* 2.含有Allocator的CopyFrom* 交换Value* 方法: Swap() 无论两颗Dom树多复杂,交换时间为常数*/rapidjson::Value testCopy1(123);rapidjson::Value testCopy2(testCopy1, document.GetAllocator());rapidjson::Value testCopy3;testCopy3.CopyFrom(testCopy1, document.GetAllocator());testCopy1.Swap(testCopy3);
}
rapidjson查询操作基本用法相关推荐
- oracle分组聚合查询,Oracle中分组查询group by用法规则解析
本篇文章小编给大家分享一下Oracle中分组查询group by用法规则解析,文章介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. Oracle中group by ...
- MongoDB的查询操作
1. 前言 在这篇博文中,我们将学习如何查询mongoDB中的数据.当我们把数据存储在mongoDB以后,我们需要把数据查询出来.毕竟CRUD操作中,查询操作在我们系统中是我们应用比较频繁的操作.我们 ...
- mysql查一个表3到5行的数据类型_MySQL入门(三) 数据库表的查询操作【重要】
序言 本节比较重要,对数据表数据进行查询操作,其中可能大家不熟悉的就对于INNER JOIN(内连接).LEFT JOIN(左连接).RIGHT JOIN(右连接)等一些复杂查询. 通过本节的学习,可 ...
- 数据库操作 linq php,.NET_asp.net使用LINQ to SQL连接数据库及SQL操作语句用法分析,本文实例讲述了asp.net使用LINQ t - phpStudy...
asp.net使用LINQ to SQL连接数据库及SQL操作语句用法分析 本文实例讲述了asp.net使用LINQ to SQL连接数据库及SQL操作语句用法.分享给大家供大家参考,具体如下: LI ...
- mysql实验训练2 数据查询操作_实验训练2:数据查询操作
<实验训练2:数据查询操作>由会员分享,可在线阅读,更多相关<实验训练2:数据查询操作(6页珍藏版)>请在人人文库网上搜索. 1.实验训练2:数据查询操作请到电脑端查看实验目的 ...
- mysql实验训练2 数据查询操作_实验训练2:数据查询操作.doc
实验训练2:数据查询操作.doc 实验训练2数据查询操作请到电脑端查看实验目的基于实验1创建的汽车用品网上商城数据库Shopping,理解MySQL运算符.函数.谓词,练习Select语句的操作方法. ...
- mysql水果表查询_最全MySQL数据库表的查询操作
序言 本节比较重要,对数据表数据进行查询操作,其中可能大家不熟悉的就对于INNER JOIN(内连接).LEFT JOIN(左连接).RIGHT JOIN(右连接)等一些复杂查询. 通过本节的学习,可 ...
- 最浅显易懂的Django系列教程(20)-查询操作
查询操作 查找是数据库操作中一个非常重要的技术.查询一般就是使用filter.exclude以及get三个方法来实现.我们可以在调用这些方法的时候传递不同的参数来实现查询需求.在ORM层面,这些查询条 ...
- php 查询构造器,Laravel框架查询构造器常见用法总结
本文实例讲述了Laravel框架查询构造器常见用法.分享给大家供大家参考,具体如下: 查询构造器也是我们使用laravel框架的一项必备技能,上一篇文章我们讲到了如何使用原生增删改查,这一篇我们就来讲 ...
最新文章
- 手把手教你学Vue-3(路由)
- Laravel 中的 Many-To-Many
- 【POJ3126 Prime Path】【POJ 3087 Shuffle'm Up】【UVA 11624 Fire!】【POJ 3984 迷宫问题】
- ABAP RANGE 实现 SELECTION-OPTION 功能
- android之PackageManager简单介绍
- mysql/mariadb应该使用utf8mb4而不是utf8
- 数据库-优化-案例-max()函数优化
- CodeForces - 1287B Hyperset(暴力水题)
- 有原创保护能力的公众帐号可申请页面模版功能和图文消息正文插入历史群发链接...
- 梯度消失和梯度爆炸_梯度消失梯度爆炸-Gradient Clip
- (转)python类:magic魔术方法
- 莫代尔是什么?它有哪些优缺点?
- 安装问题的审计(产生漏洞,抓包)
- Automapper问题记录
- 禁止Chrome的缓存
- Essential Netty in Action 《Netty 实战(精髓)》
- 5G关键技术简介带你揭开5G神秘面纱
- 【Gamemaker】YYC1.4编译的程序研究
- 大数据时代最全的医学公共数据库合集整理
- 深入理解计算机系统(v3) 第三章、程序的机器级表示(Linux)