将临时变量写入Json:我得到\ u0000

时间:2015-04-15 10:01:01

标签: c++ json rapidjson

我遇到一个奇怪的问题:当我尝试在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"}

所以在括号内添加变量似乎有问题。你知道它来自哪里吗?

2 个答案:

答案 0 :(得分:2)

感谢史蒂夫,我找到了答案:

如文件中所述: “rapidjson提供了两种存储字符串的策略。

  1. copy-string:分配缓冲区,然后将源数据复制到其中。
  2. const-string:只存储一个字符串指针。 “
  3. 所以做正题的正确方法是:

    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"}
    

答案 1 :(得分:2)

以下电话:

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的长度。它可以处理字符串中的空字符。