使用rapidjson的奇怪成员名称字符串

时间:2014-11-30 11:56:27

标签: c++ json rapidjson

我有这段代码将一些成员添加到对象类型文档

void test01(rapidjson::Document& doc)
{
    doc.AddMember("test01", 123, doc.GetAllocator());
    char name[] = "test02";
    doc.AddMember(name, 2, doc.GetAllocator());
    string sname = "test03";
    doc.AddMember(sname.c_str(), 3, doc.GetAllocator());
}

和这件序列化它

rapidjson::StringBuffer buffer;
rapidjson::PrettyWriter<rapidjson::StringBuffer> writer (buffer);
document.Accept (writer);
std::string json = buffer.GetString();

但是得到的值是

{
    "test01": 123,
    "ÌÌÌÌÌÌ": 2,
    "ÌÌÌÌÌÌ": 3
}

有人知道为什么吗?

3 个答案:

答案 0 :(得分:1)

根据vaultah的建议,我发现我必须明确创建

rapidjson::Value name(pair.first.c_str(), allocator);

强制它使用字符串复制构造函数,并使用

json.AddMember(name.Move(), Value(123).Move(), allocator);

添加到json文档。

答案 1 :(得分:1)

如果你想在addmember函数中使用变量字符串作为成员名,以下内容对我有用:

    char buff[50];
    sprintf(buff, "%d", somefacyNumber);

    Value vMemberName  (kStringType);
    vMemberName.SetString(buff, strlen(buff), nalloc);     // for buffs we must do this, 
       // if we use stringref, then next next time we add a buffer we stamp on previous value


    someObject.AddMember(vMemberName, vSomeOtherValue, nalloc); // nalloc is our allocator

答案 2 :(得分:0)

rapidjson::Document json;
json.setObject();
json.AddMemeber(StringRef(TEST01.c_str()), Value(123), json.GetAllocator());

那么,为什么&#34; test02&#34;和&#34; test03&#34;是mojibake,因为记忆没有以正确的方式分配。
虽然c_str()是弱引用,所以,上面的代码可以工作,但并不好。