我目前有一個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
而不是Document
在toJson
中,然後將分配器作爲參數傳遞。我理想中不想這樣做,主要是因爲我懶惰,想要簽名相同,所以很容易在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剛剛開始。我只是想縮小我的問題,更好地理解我的方式錯誤。