2012-11-02 37 views
4

我使用socket.io-clientpp,https://github.com/ebshimizu/socket.io-clientpp,它使用rapidjson。stringify與rapidjson

當接收到一個事件,我的函數被調用:

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

值是rapidjson值。我的問題是,我認爲將它串聯起來的唯一方法是使用Document類。 但把價值文檔,所有功能採取非const引用,例如:

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()是非const。

由於GenericValue :: Accept()只是爲處理程序生成事件,因此不需要修改該值及其死者。所以應該從改變:

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

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

您可以修補這個你rapidjson/document.h或下載最新版本(主幹或分支0.1倍)。

此更改後,您可以stringfy一個const值作爲教程:

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在我的遊戲項目中非常出色。謝謝Milo。 – Andrew

+0

你可以看看我的問題嗎? [執行rapidjson的Document對象的副本](http://stackoverflow.com/q/22707814/1967056) – SysDragon