2017-03-17 235 views
0

我目前有一個JSON序列化類,我正在使用。這是我正在研究的一些實驗代碼。此代碼使用cpprestsdk。序列化設置爲使用rapidjson或cpprestsdk的json。rapidjson轉換爲字符串時產生不一致的結果

因此,例如,該類的虛函數的樣子:

virtual void toJson(rapidjson::Document& json) const =0; 
virtual void toJson(web::json::value& json) const =0; 

virtual void fromJson(const rapidjson::Value& json) =0; 
virtual void fromJson(const web::json::value& json) =0; 

我可以從JSON轉換沒有問題。我目前正在將類對象轉換爲JSON,然後將其作爲字符串導出到文件中。我發現用rapidjson,我得到了不同的結果。

在某些出口,我看到這樣一個片段:

"base": { 
     "name\u0000refere": "base", 

在其他運行中,我看到這樣一個片段:

"base": { 
     "name": "base", 

這是連續運行的,在不改變代碼。

中的字段實際上全局定義const char *像這樣:

const char *kSymbolKeyName = "name"; 
const char *kSymbolKeyReferenceName = "referenceName"; 

生成有問題的JSON對象的代碼如下所示:

void Object::toJson(rapidjson::Document& json) const { 
    using namespace rapidjson; 

    json.SetObject(); // Reset and clear any existing 

    auto& allocator = json.GetAllocator(); 

    json.AddMember(StringRef(kObjectKeyName), Value(name.c_str(), allocator), allocator); 
    json.AddMember(StringRef(kObjectKeyPrioritizeTable), Value(prioritizeTable), allocator); 
    json.AddMember(StringRef(kObjectKeyPrioritizeGreaterOn), Value(prioritizeGreaterOn), allocator); 
} 

注意kObjectKeyName定義爲const char *kObjectKeyName = "name";

和呼叫者這一類的toJson會是什麼樣子:

using namespace rapidjson; 

json.SetObject(); // Reset and clear any existing 

auto& allocator = json.GetAllocator(); 

for (const auto& it : tables) { 
    Document iJson; 
    it.second->toJson(iJson); 
    json.AddMember(Value(it.first.c_str(), allocator), iJson, allocator); 
} 

部分問題可以從我使用rapidjson::Document S和分配器的方式乾的。一旦我撥打SetObject電話,我相信toJson呼叫將以它自己的分配器結束。

我的計劃是修改代碼以使用Value而不是DocumenttoJson中,然後將分配器作爲參數傳遞。我理想中不想這樣做,主要是因爲我懶惰,想要簽名相同,所以很容易在rapidjson或cppsrestsdk的兒子之間翻轉。

噢,代碼輸出的文件作爲字符串是以下

 std::ofstream out("output.json"); 
     rapidjson::Document outDoc; 

     dataSet.toJson(outDoc); 

     rapidjson::StringBuffer buffer; 

     buffer.Clear(); 

     rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(buffer); 
     outDoc.Accept(writer); 
     out << buffer.GetString(); 

     out.close(); 

毫無疑問的東西,我做的奇/啞巴使用rapidjson剛剛開始。我只是想縮小我的問題,更好地理解我的方式錯誤。

回答

0

如果修改要在分配器中傳遞的進程,則會出現此問題。

我修改toJson功能是

rapidjson::Value toJson(rapidjson::Document::AllocatorType& allocator); 

在我的使用,它是指所有生成Value S,在需要時,將使用基Document的分配器。

相關問題