加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

rapidjson::Document _doc解析流程

发布时间:2020-12-16 19:13:54 所属栏目:百科 来源:网络整理
导读:1rapidjson::Document _doc;2_doc.Parse0(_msg.c_str());3template unsigned parseFlagsGenericDocument Parse(const Ch* str) {RAPIDJSON_ASSERT(!(parseFlags kParseInsituFlag));GenericStringStreamEncoding s(str);return ParseStreamparseFlags(s);}4t
<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;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读