RapidJson中AddMember字符串使用Value和StringRef的区别
Value:如果字符串生命周期很短,那么必须用Value(复制一份字符串到allocator),如果用StringRef(传入字符串指针),变量销毁后则会访问到错误的地址。
StringRef:如果字符串变量生命周期能buffer.GetString之后,那么可以用StringRef(传入字符串指针)。
//DEMO:构建一个JSON并输出为字符串
string JsonEx::Demo(){
Document d;
d.SetObject();
Document::AllocatorType& allocator = d.GetAllocator();
vector<string> strs = { "111", "222", "三", "四" };
Value valArray(kArrayType);
for (int i = 0; i < strs.size(); i++){
string str = strs.at(i);
Value user(kObjectType);
//如果字符串生命周期很短,那么必须用Value(复制一份字符串到allocator),如果用StringRef(传入字符串指针),变量销毁后则会访问到错误的地址。
user.AddMember("nick", Value(str.c_str(), allocator), allocator);
valArray.PushBack(user, allocator);
}
d.AddMember("list", valArray, allocator);
string key("some"), value("this is some thing中文");
//如果字符串变量生命周期能buffer.GetString之后,那么可以用StringRef(传入字符串指针)。
d.AddMember(StringRef(key.c_str()), StringRef(value.c_str()), allocator);
//输出为字符串
StringBuffer buffer;
Writer<StringBuffer> writer(buffer);
d.Accept(writer);
string s = buffer.GetString();
MessageBoxA(NULL, s.c_str(), "json", 0);
return s;
}
网友评论