RapidJSON学习整理
2016-06-28 09:46
471 查看
参考网址: http://rapidjson.org/zh-cn/md_doc_tutorial_8zh-cn.html
关键词: 文件对象模型(Document Object Model, DOM)
1 每个json的值都储存在Value类型,而Document类表示整个DOM,它存储了整个DOM树的根Value
2 JSON被解析到Document中,模型
3 以前合法的JSON文件的根值只能是Object或Array类型,现在可以是任何类型
4 JSON的Number类型表示所有数字,而在C++中需要更专门的类型
5 RapidJSON并不自动转换各种JSON类型。例如,对一个String的Value调用GetInt()是非法的
6 查询Array。 缺省情况下,SizeType是unsigned的typedef。在多数系统中,Array最多能存储2^32-1个元素
7 Array除了使用索引进行查询,也可以使用迭代器
8 查询Object
可以用迭代器查询Object
注意,当operator[](const char*)找不到成员,它会断言失败。
若我们不确定一个成员是否存在,便需要在调用operator[](const char*)前先调用HasMember()。然而,这会导致两次查找。更好的做法是调用FindMember(),它能同时检查成员是否存在并返回它的Value:
9 创建/修改值
当使用默认构造函数创建一个Value或Document时,它的类型是Null.要改变其类型需要抵用SetXXX()或赋值操作
要创建空的Object或Array ,可在默认构造函数后调用SetObject()/SetArray(),或一次性使用Value(Type)
10 转移语意 (Move Semantics)
在设计RapidJSON时有一个特别的决定,Value赋值时,并不是把来源Value复制给目的Value,而是把来源Value转移(Move)到目的Value
*11 转移语意及临时值
有时候,我们想直接构造一个Value并传递给一个“转移”函数(如PushBack()、AddMember())。由于临时对象是不能转换为正常的Value引用,我们加入了一个方便的Move()函数:
12 修改Object
Object为键值对的集合,每个键必须为String.
关键词: 文件对象模型(Document Object Model, DOM)
1 每个json的值都储存在Value类型,而Document类表示整个DOM,它存储了整个DOM树的根Value
2 JSON被解析到Document中,模型
3 以前合法的JSON文件的根值只能是Object或Array类型,现在可以是任何类型
4 JSON的Number类型表示所有数字,而在C++中需要更专门的类型
5 RapidJSON并不自动转换各种JSON类型。例如,对一个String的Value调用GetInt()是非法的
6 查询Array。 缺省情况下,SizeType是unsigned的typedef。在多数系统中,Array最多能存储2^32-1个元素
7 Array除了使用索引进行查询,也可以使用迭代器
for (Value::ConstValueIterator itr = a.Begin(); itr != a.End(); ++itr) printf("%d ", itr->GetInt());
8 查询Object
可以用迭代器查询Object
static const char* kTypeNames[] = { "Null", "False", "True", "Object", "Array", "String", "Number" }; for (Value::ConstMemberIterator itr = document.MemberBegin(); itr != document.MemberEnd(); ++itr) { printf("Type of member %s is %s\n", itr->name.GetString(), kTypeNames[itr->value.GetType()]); }
Type of member hello is String Type of member t is True Type of member f is False Type of member n is Null Type of member i is Number Type of member pi is Number Type of member a is Array
注意,当operator[](const char*)找不到成员,它会断言失败。
若我们不确定一个成员是否存在,便需要在调用operator[](const char*)前先调用HasMember()。然而,这会导致两次查找。更好的做法是调用FindMember(),它能同时检查成员是否存在并返回它的Value:
Value::ConstMemberIterator itr = document.FindMember("hello"); if (itr != document.MemberEnd()) printf("%s %s\n", itr->value.GetString());
9 创建/修改值
当使用默认构造函数创建一个Value或Document时,它的类型是Null.要改变其类型需要抵用SetXXX()或赋值操作
Document d; // Null d.SetObject(); Value v; // Null v.SetInt(10); v = 10; // 简写,和上面的相同
要创建空的Object或Array ,可在默认构造函数后调用SetObject()/SetArray(),或一次性使用Value(Type)
Value o(kObjectType); Value a(kArrayType);
10 转移语意 (Move Semantics)
在设计RapidJSON时有一个特别的决定,Value赋值时,并不是把来源Value复制给目的Value,而是把来源Value转移(Move)到目的Value
Value a(123); Value b(456); b = a; // a变成Null,b变成数字123
*11 转移语意及临时值
有时候,我们想直接构造一个Value并传递给一个“转移”函数(如PushBack()、AddMember())。由于临时对象是不能转换为正常的Value引用,我们加入了一个方便的Move()函数:
Value a(kArrayType); Document::AllocatorType& allocator = document.GetAllocator(); // a.PushBack(Value(42), allocator); // 不能通过编译 a.PushBack(Value().SetInt(42), allocator); // fluent API a.PushBack(Value(42).Move(), allocator); // 和上一行相同
12 修改Object
Object为键值对的集合,每个键必须为String.
相关文章推荐
- JS传递对象数组为参数给后端,后端获取的实例代码
- JavaScript ES5标准中新增的Array方法
- js:字符串(string)转json
- undefined与null的区别
- 关于XML和JSON
- jsp登录会话的简单实现
- javascript oo实现(面向对象)
- 用isNaN函数判断是否是Number中的坑
- 关于JS 预解释的相关理解
- [Effective JavaScript 笔记]第49条:数组迭代要优先使用for循环而不是for...in循环
- [Effective JavaScript 笔记]第48条:避免在枚举期间修改对象
- 详解javascript,ES5标准中新增的几种高效Array操作方法
- 浅谈js中的in-for循环
- js实现一键分享效果---横栏状态
- Js实现一键分享效果--悬浮框状态
- jsp登录会话
- [拆边费用流] BZOJ 1449 [JSOI2009]球队收益
- 混合应用中的javascript实践
- ES6新特性:使用新方法定义javascript的Class
- ABP框架中导航菜单的使用及JavaScript API获取菜单的方法