您的位置:首页 > Web前端 > JavaScript

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除了使用索引进行查询,也可以使用迭代器

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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: