将临时变量写入 Json :我得到 \u0000
write temporary variable to Json : I get \u0000
我遇到了一个奇怪的问题:当我尝试在 for 循环中添加一个 Json 变量时,它没有正确写入输出文件,而它在循环外运行良好 (rapidJson v0.11)。
编辑:循环不是问题,但即使只有括号也会出现错误
这是我的代码示例:
rapidjson::Document output;
output.SetObject();
rapidjson::Document::AllocatorType& allocator = output.GetAllocator();
{
std::string s1("test");
output.AddMember("test_field",s1.c_str(), allocator);
}
std::string s2("test");
output.AddMember("test_field2",s2.c_str(), allocator);
rapidjson::FileStream f(stdout);
rapidjson::PrettyWriter<rapidjson::FileStream> writer(f);
output.Accept(writer);
我得到的输出是:
{"test_field": "\u0000est",
"test_field2": "test"}
所以括号内添加的变量似乎有问题..你知道它从哪里来吗?
感谢史蒂夫,我找到了答案:
如文档中所述:
"rapidjson 提供了两种存储字符串的策略。
- copy-string:分配一个缓冲区,然后将源数据复制到其中。
- const-string: 简单的存储一个string的指针。 “
所以做我想做的事情的正确方法是:
rapidjson::Document output;
output.SetObject();
rapidjson::Document::AllocatorType& allocator = output.GetAllocator();
{
std::string s1("test");
rapidjson::Value field;
char buffer[10];
int len = sprintf(buffer, s1); .
field.SetString(buffer, len, allocator);
output.AddMember("test_field",field, allocator);
}
std::string s2("test");
output.AddMember("test_field2",s2.c_str(), allocator);
rapidjson::FileStream f(stdout);
rapidjson::PrettyWriter<rapidjson::FileStream> writer(f);
output.Accept(writer);
我现在得到的输出是:
{"test_field": "test",
"test_field2": "test"}
以下调用:
output.AddMember("test_field",s1.c_str(), allocator);
将第二个参数视为常量字符串。这是不对的,因为 s1
将被销毁出块。
您需要复制字符串。一个解决方案是:
Value v(s1.c_str(), allocator);
output.AddMember("test_field", v, allocator);
或等效地:
output.AddMember("test_field", Value(s1.c_str(), allocator).Move(), allocator);
更快(也更好)的版本是:
output.AddMember("test_field", Value(s1.c_str(), s1.size(), allocator).Move(), allocator);
因为这不需要调用类似strlen()
的函数来查找s1
的长度。它可以处理字符串中的空字符。
我遇到了一个奇怪的问题:当我尝试在 for 循环中添加一个 Json 变量时,它没有正确写入输出文件,而它在循环外运行良好 (rapidJson v0.11)。
编辑:循环不是问题,但即使只有括号也会出现错误
这是我的代码示例:
rapidjson::Document output;
output.SetObject();
rapidjson::Document::AllocatorType& allocator = output.GetAllocator();
{
std::string s1("test");
output.AddMember("test_field",s1.c_str(), allocator);
}
std::string s2("test");
output.AddMember("test_field2",s2.c_str(), allocator);
rapidjson::FileStream f(stdout);
rapidjson::PrettyWriter<rapidjson::FileStream> writer(f);
output.Accept(writer);
我得到的输出是:
{"test_field": "\u0000est",
"test_field2": "test"}
所以括号内添加的变量似乎有问题..你知道它从哪里来吗?
感谢史蒂夫,我找到了答案:
如文档中所述: "rapidjson 提供了两种存储字符串的策略。
- copy-string:分配一个缓冲区,然后将源数据复制到其中。
- const-string: 简单的存储一个string的指针。 “
所以做我想做的事情的正确方法是:
rapidjson::Document output;
output.SetObject();
rapidjson::Document::AllocatorType& allocator = output.GetAllocator();
{
std::string s1("test");
rapidjson::Value field;
char buffer[10];
int len = sprintf(buffer, s1); .
field.SetString(buffer, len, allocator);
output.AddMember("test_field",field, allocator);
}
std::string s2("test");
output.AddMember("test_field2",s2.c_str(), allocator);
rapidjson::FileStream f(stdout);
rapidjson::PrettyWriter<rapidjson::FileStream> writer(f);
output.Accept(writer);
我现在得到的输出是:
{"test_field": "test",
"test_field2": "test"}
以下调用:
output.AddMember("test_field",s1.c_str(), allocator);
将第二个参数视为常量字符串。这是不对的,因为 s1
将被销毁出块。
您需要复制字符串。一个解决方案是:
Value v(s1.c_str(), allocator);
output.AddMember("test_field", v, allocator);
或等效地:
output.AddMember("test_field", Value(s1.c_str(), allocator).Move(), allocator);
更快(也更好)的版本是:
output.AddMember("test_field", Value(s1.c_str(), s1.size(), allocator).Move(), allocator);
因为这不需要调用类似strlen()
的函数来查找s1
的长度。它可以处理字符串中的空字符。