最近在使用boost庫中的json解析器時遇到了一個bug。
在使用boost json庫解析json格式的字符串時,對于如下形式的字符串:
{ "key": value }
解析時會出現(xiàn)boost::property_tree::json_parser_error錯誤,并拋出”unexpected character”異常。
經(jīng)過查看源碼和調試,發(fā)現(xiàn)原因是由于解析器無法正確處理json片段中的未加引號的字符串。
具體來說,在上例中,如果value的類型為字符串,并且字符串未加引號,例如:
{ "key": hello world }
那么解析器會把hello當作key的值,然后在解析world時就出現(xiàn)了異常。因此,boost json庫的解析器需要對未加引號的字符串進行特殊處理。
解決這個問題的方法是使用boost庫提供的json_parser_write_stream轉換器,將字符串轉為流,然后再通過json_parser解析該流。
boost::property_tree::ptree pt; std::istringstream is("{\"key\": hello world}"); boost::property_tree::json_parser::write_json(is, pt);
通過這種方式,我們就可以成功地解析未加引號的字符串了。
需要注意的是,在進行json格式數(shù)據(jù)解析時,我們應該盡可能地保證數(shù)據(jù)的規(guī)范性,盡可能地使用雙引號對字符串進行包裹,這樣可以避免出現(xiàn)各種問題和bug。