2014-02-17 65 views
2

如果我使用read_json從stringstream創建屬性樹,然後使用write_json將其寫回到流中,則嘗試使用read_json再次加載它,失敗,並返回 「terminate called after投擲的實例 '的boost :: exception_detail :: clone_impl>' 什麼():(1):預期對象或數組」Boost read_json和write_json對於屬性樹不是等價的

此代碼失敗,並forementioned例外:

#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); 

回答

0

我寫下來,以防萬一有人讓我做了同樣的錯誤答案。

read_json是爲文件設計的,而不是字符串流訪問,所以當我給它提供write_json寫入的stringstream時,流只是在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); 
+0

當然,這不是「Boost PT的設計特性」。這是流的語義,特別是stringstreams – sehe