2017-03-17 41 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的分配器。

相关问题