странная строка имени участника с 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
}

Кто-нибудь знает, почему?


person Ngoc    schedule 30.11.2014    source источник


Ответы (3)


Если вам нужна переменная строка в качестве имени члена в функции 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
person Paulus    schedule 14.01.2015

основываясь на том, что предложил vaultah, я узнал, что мне нужно явно создать

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

чтобы заставить его использовать конструктор копирования строк и использовать

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

добавить в документ json.

person Ngoc    schedule 30.11.2014

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

Итак, почему "test02" и "test03" являются моджибаке, это потому, что память не распределена должным образом.
Хотя c_str() является слабой ссылкой, приведенный выше код может работать, но не является хорошим.

person yeyimilk    schedule 19.04.2016