JSON是一種比XML輕量的資料交換格式,應用越來越廣泛,尤其是網頁資料方面。其作為Javascript的字元描述語言,可以被自動解析;PHP 5.2以上也内置了JSON解析函數。在C/C++語言開發中,目前開源的JSON處理庫也很多,包括JsonCPP, QJson, JSON Spirit, jaula,json-c等,但是其中支援Windows平台且支援中文的好像隻有json-c。
公司産品開發中一直用的庫是JSON Spirit,最近碰到了中文支援的問題:每次讀寫帶有中文的JSON字元串到檔案,都會傳回異常。(貌似不與IO打交道時還可以用。)
跟了一下JSON Spirit的源碼,發現它是基于STL/boost标準庫實作的,資料結構也都是在這些庫的基礎上擴充的。當然,IO stream也是STL的标準流。那麼,要想讓JSON Spirit支援中文,也就是要讓标準流支援中文;要想讓IO流支援中文,就需要在IO流中選入支援中文的locale對象。
JSON Spirit庫提供了讀寫檔案的函數,使用起來非常友善。通過以上分析,讀JSON字元串檔案的代碼可以這樣寫:
wstring wstrFile = L"D:\json.txt";
wifstream is( wstrFile.c_str());
is.imbue(locale("chs"));
json_spirit::wValue value;
if( json_spirit::read( is, value) == false)
{
...
}
is.close();
... // handle json string
寫JSON字元串檔案的代碼為:
wofstream os( wstrFile.c_str());
os.imbue(locale("chs"));
json_spirit::write_formatted( objData, os);
os.close();
這樣,JSON Spirit庫就可以支援讀寫帶有中文字元串的檔案了。