2012-11-02 2 views
4

Я использую socket.io-clientpp, https://github.com/ebshimizu/socket.io-clientpp, который использует quickjson.stringify with rapidjson

Когда событие получено, моя функция называется:

void data_published(socketio::socketio_events&, const Value& v) { 

Значение значение rapidjson. Моя проблема заключается в том, что единственный способ, с помощью которого я его строю, - это класс Document. Но поставить значение в документе, все функции принимают неконстантную ссылку, например:

GenericValue& AddMember(const Ch* name, GenericValue& value, Allocator& allocator) { 

Я привык к jsonpp, я что-то глупо я думаю нет. Вопрос прост: как укрепить значение const rapidjson?

ответ

13

Я являюсь автором rapidjson. Спасибо Вам за Ваш вопрос. Я зарегистрировал это для выпуска в http://code.google.com/p/rapidjson/issues/detail?id=45

Это связано с тем, что GenericValue :: Accept() не является константой.

Как GenericValue :: Accept() только генерирует события для обработчика, ему не нужно изменять значение и его дециенты. Так что должно измениться:

template <typename Handler> 
GenericValue& Accept(Handler& handler) 

в

template <typename Handler> 
const GenericValue& Accept(Handler& handler) const 

Вы можете исправить это ваш rapidjson/document.h или загрузить последнюю версию (ствол или ветви) 0,1 x.

После этого изменения, вы можете stringfy константного значения, как в учебнике:

const Value& v = ...; 
FileStream f(stdout); 
PrettyWriter<FileStream> writer(f); 
v.Accept(writer); 

Или строковый буфер:

const Value& v = ...; 
StringBuffer buffer; 
PrettyWriter<StringBuffer> writer(buffer); 
v.Accept(writer); 
const char* json = buffer.GetString(); 
+1

Я установил вторую часть кода, вы имели FileStream как вы должны были просто скопировать и вставить его. rapidjson отлично подходит для моего игрового проекта. Спасибо, Мило. – Andrew

+0

Не могли бы вы взглянуть на мой вопрос? Выполнить копию объекта Document rapidjson (http://stackoverflow.com/q/22707814/1967056) – SysDragon