03rapidJson学习之对象的创建、遍历

03rapidJson学习之对象的创建、遍历

概述:

这里强调一点,对象是可以作为返回值返回的,因为对象是一个整体。而数组是不能返回的,因为数组必须依赖一个对象才能返回。数组一般依赖doc作引用参数时,伴随根对象返回。

1 对象的创建

//从doc中获取string字符串内容
std::string GetStrWithDoc(Document &doc) {
	rapidjson::StringBuffer buffer;//画板
	rapidjson::Writer<StringBuffer> writer(buffer);//画家交给画板
	doc.Accept(writer);//利用画家将doc的内容画进画板

	return buffer.GetString();
}


//创建一个对象并返回.注意:数组是不能返回的,因为数组必须依赖一个对象才能返回.
Value CreateObject(Document &doc, std::string cid, std::string rtsp, int para) {
	//1 设置doc的对象并且获取分配器
	doc.SetObject();
	Document::AllocatorType &a = doc.GetAllocator();

	//2 创建一个对象
	Value o1(kObjectType);

	//3 使用Value给对象的key赋值,以便调用AddMember
	Value v1(cid.c_str(), a);
	Value v2(rtsp.c_str(), a);

	//4 添加key到对象中
	o1.AddMember("camera_uid", v1, a);//AddMember参2为对象时必须是Value类型,且对象都必须使用分配器
	o1.AddMember("rtsp_url", v2, a);
	o1.AddMember("para", para, a);//int,bool不需要转成Value类型即可传参

	//5 返回对象
	return o1;
}


void test01() {

	Document doc;
	Value o1(kObjectType);

	//创建对象并返回
	o1 = CreateObject(doc, "123", "rtsp_url", 0);
	doc.AddMember("obj", o1, doc.GetAllocator());

	//打印
	std::string str = GetStrWithDoc(doc);
	std::cout << str.c_str() << std::endl;
}

int main() {

	test01();

	return 0;
}

上面程序结果:
在这里插入图片描述

2 对象的遍历
参照官方给出的文档,只给出了两种遍历对象的方式。一种是迭代器遍历;另一种是使用C++11新特性auto。对比数组少了下标类型的遍历,大家有时间可以试试。
1)迭代器遍历

//对象的遍历-迭代器
void test02() {
	Document doc;
	Value o1(kObjectType);

	//利用上面的函数创建对象
	o1 = CreateObject(doc, "123", "rtsp_url", 0);
	//doc.AddMember("object", o1, doc.GetAllocator());

	if (o1.IsObject() == false) {
		return;
	}

	//对象里的七种类型,用于判断对象的value类型,因为我在if已经判断是哪种类型,所以实际上无需再用这个数组,
	static const char* kTypeNames[] ={ "Null", "False", "True", "Object", "Array", "String", "Number" };

	//迭代器遍历对象,遍历的对象是我们刚创建的o1,当然你也可以遍历其它对象,只要是对象即可,不一定是doc
	for (Value::ConstMemberIterator it = o1.MemberBegin(); it != o1.MemberEnd(); ++it) {
		if (o1.HasMember(it->name) && it->value.IsString()) {
			//必须保证it指向的值是存在,否则[]索引时报错,这就是我们上面调用HasMember的原因,并且注意值类型是使用value去判断,否则报错
			printf("I am key = %s. value = %s, type = %s.\n", it->name.GetString(), it->value.GetString(), kTypeNames[it->value.GetType()]);
		}
		else if (o1.HasMember(it->name) && it->value.IsInt()) {
			printf("I am key = %s. value = %d, type = %s.\n", it->name.GetString(), it->value.GetInt(), kTypeNames[it->value.GetType()]);
		}
		else {
			//其它类型一样判断
		}
		
	}

}

上面程序结构:
在这里插入图片描述

2)C++11新特性遍历
我们调用上面的创建对象函数后,我在使用auto新特性遍历时,发现VS给我报错了,点击它大概的意思就是说我没有给这个对象调用doc.GetAllocator()分配内存,导致无法遍历。所以我们想要使用auto新特性遍历对象好像只能遍历doc根对象了,其它对象只能使用上面的迭代器遍历了,不过已经足够了。
在这里插入图片描述

3 总结

  • 1)对象的创建可以由返回值来返回,数组不能。
  • 2)一般对象的遍历只能使用迭代器去遍历,doc根对象可以使用auto新特性遍历。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值