问题描述:
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",则表示为非空表里有一个空类型