rapidjson::Document _doc解析流程

前端之家收集整理的这篇文章主要介绍了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;
}
原文链接:https://www.f2er.com/json/290053.html

猜你在找的Json相关文章