2012-09-22 59 views
0

我試着去閱讀癟JSON和體驗型轉換的問題,這裏是代碼提高property_tree :: json_parser :: read_json和輸入輸出流:: filtering_streambuf

boost::iostreams::filtering_streambuf<boost::iostreams::input> in; 
std::istringstream iss(std::ios::binary); 
iss.rdbuf()->pubsetbuf(buf, len); 
iss.imbue(std::locale("ru_RU.CP1251")); 
in.push(boost::iostreams::zlib_decompressor()); 
in.push(iss); 

boost::property_tree::ptree pt; 
boost::property_tree::json_parser::read_json(in, pt); // <-- Compile error 

編譯器說:

src/ABPacking.cpp:48: error: no matching function for call to ‘read_json(boost::iostreams::filtering_streambuf, std::allocator, boost::iostreams::public_>&, boost::property_tree::ptree&)’

的問題是如何通過filtering_streambufread_json沒有不必要的數據複製?

+0

你到底想幹什麼? 'read_json'需要一個文件或文件名作爲第一個參數,然後該文件被解析到作爲第二個參數傳遞的屬性樹中。 – Xeo

+0

@Xeo no,read_json可以獲取std :: basic_istream和std :: string,請參閱[link](http://www.boost.org/doc/libs/1_41_0/doc/html/property_tree/reference.html#header .boost.property_tree.json_parser_hpp),所以我想傳遞從filtering_streambuf得到的流 – PSIAlt

+1

Right-o,但是沒有需要流* buffer *的重載。只要把緩衝區放到'istream'中,你應該沒問題。 'std :: istream輸入(&in);'。 – Xeo

回答

2

read_json預計文件名或帶有JSON內容的。你試圖通過一個流緩衝區,它不知道該怎麼辦。

作爲一個解決方案,只是通過流緩衝區的istream消耗,並傳遞到read_json

std::istream input(&in_buf); 
read_json(input, pt);