RapidJson中AddMember字符串使用Value和St

2020-02-22  本文已影响0人  晓函

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;
    
}
上一篇 下一篇

猜你喜欢

热点阅读