目前的工作中需要在Haxe中解析Json文本,在haxelib中有兩個Json相關的第三方庫,不過都很久沒更新了,從Haxe 2.1以後,Json API已經成爲標準庫中的一部分,具體即haxe.Json類。
目前我只用到解析,用起來也很簡單,調用Json.parse(jsonText: String)即可把Json文本解析成Dynamic對象。支持布爾、整數、浮點數、字符串、數組、複合對象等數據類型。
要注意的一點是,屬性名也必須用雙引號引起來,否則無法解析,如下示例,uid和name外面的雙引號是不能省略的:
{ "uid": 12345, "name": "Rocks Wang" }
在Flash目標中,運行時的字符串編碼是Unicode,因此中文毫無問題,這裏不贅述。
在cpp目標中,字符串在運行時其實就是C++中的char*,因此中文編碼是需要引起特別注意的。Haxe及NME中對中文的處理還算不錯,絕大部分情況下,只要保證使用UTF-8編碼,中文即可正常解析及顯示。
Json API也是一樣,只要Json.parse(jsonText: String) 中jsonText參數是以UTF-8編碼的,即可解析包含中文的Json文本。
但是實際使用中發現中文解析經常出錯,經源碼分析,確定是Json類中存在一個Bug,具體修正如下:
321行,修正前:
else if( c >= 0x80 ) {
pos++; //這裏多跳了一個字符,因爲nextChar本身就要跳一個字符
if( c >= 0xE0 ) pos += 1 + (c & 32); //根據第5位決定是否多跳一個字符,具體請參見UTF-8編碼規範
修正後:
else if( c >= 0x80 ) {
pos += 1 + ((c & 32) >> 5);
做此修正後,Json類可完美解析含中文的Json文本數據。