文件对象模型(Document Object Model, DOM)。可以解析一个 JSON 至 DOM,然后就可以轻松查询及修改 DOM,并最终转换回 JSON。
把rapidjson文件夹拷贝到工程里就可以了
其中有需要的头文件
每个 JSON 值都储存为 Value
类,而 Document
类则表示整个 DOM,它存储了一个 DOM 树的根 Value
。RapidJSON 的所有公开类型及函数都在 rapidjson
命名空间中。
// 使用引用来连续访问,方便之余还更高效。
const Value& a = document["a"];
assert(a.IsArray());
for (SizeType i = 0; i < a.Size(); i++) // 使用 SizeType 而不是 size_t
printf("a[%d] = %d\n", i, a[i].GetInt());
查询 Array
缺省情况下,SizeType
是 unsigned
的 typedef。在多数系统中,Array 最多能存储 2^32-1 个元素。
你可以用整数字面量访问元素,如 a[0]
、a[1]
、a[2]
。
Array 与 std::vector
相似,除了使用索引,也可使用迭代器来访问所有元素。
for (Value::ConstValueIterator itr = a.Begin(); itr != a.End(); ++itr)
printf("%d ", itr->GetInt());
还有一些熟悉的查询函数:
SizeType Capacity() const
bool Empty() const
范围 for 循环 (v1.1.0 中的新功能)
当使用 C++11 功能时,你可使用范围 for 循环去访问 Array 内的所有元素。
for (auto& v : a.GetArray())
printf("%d ", v.GetInt());
查询 Object
和 Array 相似,我们可以用迭代器去访问所有 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\n", itr->value.GetString());
范围 for 循环 (v1.1.0 中的新功能)
当使用 C++11 功能时,你可使用范围 for 循环去访问 Object 内的所有成员。
for (auto& m : document.GetObject())
printf("Type of member %s is %s\n",
m.name.GetString(), kTypeNames[m.value.GetType()]);
创建/修改值
有多种方法去创建值。 当一个 DOM 树被创建或修改后,可使用 Writer