相关文章推荐
憨厚的紫菜汤
·
針對登入登錄進行疑難排解 - Azure ...
·
5 月前
·
不羁的番茄
·
flutter网络dio框架公共请求参数、请 ...
·
1 年前
·
叛逆的充电器
·
厉害了,“View背景模糊”的四种写法!_A ...
·
1 年前
·
豁达的企鹅
·
c#中如何使用到模糊查询 - ...
·
1 年前
·
冷冷的茄子
·
stanford计算机课程列表-阿里云开发者社区
·
1 年前
·
Code
›
rapidjson查询操作基本用法_rapidjson getstring_langzi989的博客
string
字符串函数
rapidjson
https://blog.csdn.net/u014630623/article/details/89020039
苦闷的生菜
1 年前
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中取出string
std
::
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
;
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 string
rapidjson
::
Value
(
)
.
Move
(
)
,
// null value
document
.
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
)
;
r
api
d
json
中文使用手册 r
api
d
json
的
基本
介绍、使用好处、解析速度等不在此篇讲述,因为在官网上已经讲得非常详细了,这里写的都是本人拙劣的见解,如有不足之处,烦请各位指出。 本文结构: 1、
基本
单元; 1、
基本
单元 r
api
d
json
的
基本
操作
单元:Document以及Value 例:当有一个
json
案例,请让我们称之为te... #include "r
api
d
json
/document.h" #include "r
api
d
json
/writer.h" #include "r
api
d
json
/
string
... 用于记录R
api
d
Json
使用中的坑位,持续更新。关于r
api
d
json
的详细说明,可以参加参考文档:http://r
api
d
json
.org/zh-cn/md_doc_tutorial_8zh-cn.html#Create
String
1、添加字符串元素 #include "r
api
d
json
/document.h" #include "r
api
d
json
/prettywrite... R
api
d
JSON
是一个 C++ 的
JSON
解析器及生成器。它的灵感来自 R
api
dXml。使用方法:R
api
d
JSON
: 首页http://r
api
d
json
.org/zh-cn/index.html 这里 r
api
d
json
为作用域; 那么现在该
JSON
就会被解析至 中,成为一棵 *DOM 树 *: 让我们
查询
一下根 Object 中有没有 成员。由于一个 可包含不同类型的值,我们可能需要验证它的类型,并使用合适的
API
去获取其值。在此例中, 成员关联 我在工作中一直使用的是r
api
d
json
库,这是我在工作中使用该库作的一些整理,以读写下面的这段
json
字符串为例来进行整理,该字符串覆盖了平时使用的布尔类型、整型、浮点类型、结构体类型、字符串类型以及相对应的数组类型。 在c++中用来解析
Json
的库很多,如
Json
cpp。 我之前也使用
Json
cpp来做
Json
解析,但自从接触r
api
d
json
后,特别是尝试使用之后,便决定以后就使用它了,要与
Json
cpp说拜拜。 使用
Json
cpp的同学不妨尝试一下,不管在易用性还是性能方面,r
api
d
json
都是可圈可点的。 R
api
d
JSON
是一个 C++ 的
JSON
解析器及生成器。它的灵感来自 R
api
d... 本文基于2018年1月最新仓库代码撰写 仓库: https://github.com/Tencent/r
api
d
json
用法
: 将’include/r
api
d
json
’文件夹copy到工程内直接使用 Android ndk开发会增大apk体积1.4M, 当然, 肯定比自己写的要快 重要的内容在前面 本例Android工程地址 https://github.com/HOLDfoot
推荐文章
憨厚的紫菜汤
·
針對登入登錄進行疑難排解 - Azure Container Registry | Microsoft Learn
5 月前
不羁的番茄
·
flutter网络dio框架公共请求参数、请求header使用总结-阿里云开发者社区
1 年前
叛逆的充电器
·
厉害了,“View背景模糊”的四种写法!_Android_进行_控件
1 年前
豁达的企鹅
·
c#中如何使用到模糊查询 - ArvinCQJ - 博客园
1 年前
冷冷的茄子
·
stanford计算机课程列表-阿里云开发者社区
1 年前