对于属性树,Boost read_json和write_json不是等效的

时间:2014-02-17 00:25:07

标签: c++ json boost boost-propertytree

如果我使用read_json从stringstream创建属性树,并使用write_json将其写回流中,则尝试使用read_json再次加载它会失败 “在抛出'boost :: exception_detail :: clone_impl>'的实例后终止调用   what():( 1):期望的对象或数组“

此代码因前述异常而失败:

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
using boost::property_tree::ptree;
ptree pt;
stringstream pippo("{\"size\":1000,\"reserved\":100,\"list\": {\"122\":1,\"123\":3}}");
read_json(pippo,pt);
write_json(pippo,pt,false);
read_json(pippo,pt);

但是如果我以这种方式更改我的代码,它就会起作用:

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
using boost::property_tree::ptree;
ptree pt;
stringstream pippo("{\"size\":1000,\"reserved\":100,\"list\": {\"122\":1,\"123\":3}}");
read_json(pippo,pt);
write_json(pippo,pt,false);
stringstream pluto(pippo.str());
read_json(pluto,pt);

1 个答案:

答案 0 :(得分:0)

我写下答案,万一有人犯了同样的错误。

read_json是为文件设计的,而不是字符串流访问,所以当我给它写一个由write_json写的字符串流时,该流就是eof。 此代码现在有效:

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
using boost::property_tree::ptree;
ptree pt;
stringstream pippo("{\"size\":1000,\"reserved\":100,\"list\": {\"122\":1,\"123\":3}}");
read_json(pippo,pt);
write_json(pippo,pt,false);
pippo.seekg(0,pippo.beg);
read_json(pippo,pt);