我目前有一个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刚刚开始。我只是想缩小我的问题,更好地理解我的方式错误。