最近在使用C++中的boost庫解析JSON時,突然遇到了一個奇怪的問題,每次解析JSON都會觸發一個斷點。
//代碼片段 boost::property_tree::ptree pt; boost::property_tree::read_json(jsonString, pt);
經過仔細排查,發現問題出在了read_json函數上。
//read_json函數定義 templateinline void read_json(std::basic_istream &stream, Ptree &pt, const read_json_options &options = read_json_options()) { basic_parser parser(pt, options); parser.parse(stream); }
通過查看read_json函數的源碼,發現它是通過調用basic_parser類的parse函數來解析JSON的。于是我們來看一下basic_parser類的定義。
//basic_parser類定義片段 templateclass basic_parser { public: basic_parser(Ptree &pt): self_(pt) {} void parse(std::basic_istream &stream); private: Ptree &self_; //... };
在basic_parser類的定義中,我們可以看到parse函數的實現,參數為std::basic_istream
解決這個問題非常簡單,只需要在read_json函數中將jsonString的值傳遞給basic_parser類的parse函數即可。
//解決方案 boost::property_tree::ptree pt; boost::property_tree::basic_parserparser(pt); parser.parse(std::basic_istringstream (jsonString));
經過這一修改,程序不再觸發斷點而是正常運行了。