rapidjson::Document _doc解析流程

<1>
rapidjson::Document _doc;

<2>
_doc.Parse<0>(_msg.c_str());

<3>
template <unsigned parseFlags>
GenericDocument& Parse(const Ch* str) {
	RAPIDJSON_ASSERT(!(parseFlags & kParseInsituFlag));
	GenericStringStream<Encoding> s(str);
	return ParseStream<parseFlags>(s);
}

<4>
template <typename Encoding>
struct GenericStringStream {
	typedef typename Encoding::Ch Ch;
	
	GenericStringStream(const Ch *src) : src_(src),head_(src) {}
	
	Ch Peek() const { return *src_; }
	Ch Take() { return *src_++; }
	size_t Tell() const { return src_ - head_; }
	
	Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; }
	void Put(Ch) { RAPIDJSON_ASSERT(false); }
	size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; }
	
	const Ch* src_;		//!< Current read position.
	const Ch* head_;	//!< Original head of the string.
};

<5>
template <unsigned parseFlags,typename Stream>
GenericDocument& ParseStream(Stream& stream) {
	ValueType::SetNull(); // Remove existing root if exist
	GenericReader<Encoding,Allocator> reader;
	if (reader.template Parse<parseFlags>(stream,*this)) {
		RAPIDJSON_ASSERT(stack_.GetSize() == sizeof(ValueType)); // Got one and only one root object
		this->RawAssign(*stack_.template Pop<ValueType>(1));	// Add this-> to prevent issue 13.
		parseError_ = 0;
		errorOffset_ = 0;
	}
	else {
		parseError_ = reader.GetParseError();
		errorOffset_ = reader.GetErrorOffset();
		ClearStack();
	}
	return *this;
}

相关文章

AJAX是一种基于JavaScript和XML的技术,能够使网页实现异步交...
在网页开发中,我们常常需要通过Ajax从后端获取数据并在页面...
在前端开发中,经常需要循环JSON对象数组进行数据操作。使用...
AJAX(Asynchronous JavaScript and XML)是一种用于创建 We...
AJAX技术被广泛应用于现代Web开发,它可以在无需重新加载页面...
Ajax是一种通过JavaScript和HTTP请求交互的技术,可以实现无...