問題描述:
1、打印字段BonusStatus的類型,print( type(BonusStatus) ),其結果為userdata。
2、直接打印BonusStatus,print(BonusStatus),其結果為nil
3、將BonusStatus轉成string打印,print(tostring(BonusStatus)),其結果為nil
引發這個問題的原因:
一般來說是數據通過協議轉換后,得到了一個數據,這個數據是屬於一個類中包含了null類。
例如正常數據:BonusInfo":{"BonusStatus":{ a = 1,b=2,c=3,d=4}},如果是這樣,就應該是正常數據不會出現描述的異常。
但服務端傳遞過來的數據有可能是以下異常數據:
BonusInfo":{"BonusStatus":null}。
在服務端時,這個數據解析為BonusInfo類中包含一個名叫BonusStatus的類,但這個類為null。
此時在lua端的解析為類型為table的BonusInfo里面包含一個類型為userdata的BonusStatus,且這個BonusStatus的數據為nil。
原因是因為BonusInfo正常解析出來了,而BonusStatus則未正常解析。
但這個時候,你無法直接通過BonusStatus的類型或者數據去判斷,因為你總不能無事有事將它轉成string去判斷吧,萬一人家是正常的且有幾百個上千個字段呢。
處理辦法:
獲取BonusStatus元表的類型,直接判斷其是否為nil類型,若為nil,你再根據情況考慮是否將整個BonusStatus置為nil。
type(getmetatable(BonusStatus)) == "nil"
或者另外一種判斷方法:
tostring(BonusStatus) ~= "userdata: NULL"
這種方式比判斷元表要來的更簡單,如果轉tostring后字符串為"userdata: NULL",則表示為非空表里有一個空類型