谷歌JSON输出错过了结束大括号

时间:2015-05-12 14:42:39

标签: c++ json cereal

我正在使用Cereal C++ v1.1.1,与我正在尝试以下文档中提供的example类似:

#include <sstream>
#include <iostream>
#include <cereal/archives/json.hpp>

int main() {
  std::ostringstream os;
  cereal::JSONOutputArchive archive(os);
  int x = 12;
  archive(CEREAL_NVP(x));
  std::cout << os.str(); // JUST FOR DEMONSTRATION!
}

我希望有以下内容:

{
  "x":12
}

但缺少结束大括号。知道代码中缺少什么吗?

更新

添加archive.finishNode()似乎可以解决问题。但我会说这不是解决方案。根据{{​​3}}文档,调用操作符序列化输入参数,为什么要添加finishNode额外的?

1 个答案:

答案 0 :(得分:10)

我遇到了同样的问题,并在对谷歌的GitHub提交的问题的评论中找到了解决方案:https://github.com/USCiLab/cereal/issues/101

  

文档说明“档案旨在用于RAII   方式,并保证只冲洗他们的内容   破坏......“(http://uscilab.github.io/cereal/quickstart.html)。

     

你的问题是你正在尝试打印的内容   存档被销毁之前的字符串流。此时,   archive不知道你是否想要在其中写入更多数据   未来,所以它避免流出结束支架。您   需要确保之前已经调用了存档的析构函数   打印出stringstream。

     

试试这个:

int main()
{
  std::stringstream ss;
  {
    cereal::JSONOutputArchive archive( ss );
    SomeData myData;
    archive( myData );
  }
  std::cout << ss.str() << std::endl;

  return 0;
}
     

有关详细信息,请参阅文档。