当前位置:网站首页>LitJson使用中的一些问题
LitJson使用中的一些问题
2022-08-08 20:05:00 【前端开发小司机】
LitJson使用中的一些问题
使用C#做Untiy开发时,有解析Json的需求,选择使用了LitJson这个库,因为之前我们是使用lua的,这个库会将Json解析后保存为JsonData,这个JsonData和lua的table使用上有点类似,但有些问题要注意。
- 取值时要先检测key是否存在
lua的table可以使用 some_table.key或 some_table[‘key’] 来取值,key不存在则返回nil,但是JsonData中如果key不存在,则 some_data[“key”] 会抛出异常,所以在取值前必须要先用Contains检测下,并且由于JsonData同时实现了IDictionary和IList接口,并且都是实现为显示接口成员,所以还要显示的指定是IDictionary的Contains:
int intValue = 0;
if(((IDictionary)some_data).Contains("value")){
intValue = (int)responseData["value"];
}
- 取值后要转型
和lua不同,c#是强类型的,从JsonData中取出的值必须要转型才能赋值,如上面的代码,使用(int)强转。当然如果value本身就是JsonData则可直接赋值给JsonData类型的变量。
- 整形值转型到long可能抛出异常
如果json文本中含有数字,LitJson会优先识别为int32,仅当Int32.TryParse失败时才识别为int64,这其实也是合理的。问题是想把某个整形值转换为Long时,很可能抛出异常,例如: long value = (long)data[“key”]; 如果key对应的值是1000这样,这个转换就会抛出异常。这是因为LitJson没有考虑到int32到int64的转换。我修改了一下Int64的转换函数就可以了,修改后的函数如下:
public static explicit operator Int64 (JsonData data)
{
if (data.type != JsonType.Long && data.type != JsonType.Int)throw new InvalidCastException ("Instance of JsonData doesn't hold an int");
return (data.type == JsonType.Long)?data.inst_long : data.inst_int;
}
- 使用IDictionary和IList接口的方法时要先转型到相应接口
如上面所说,JsonData同时实现了IDictionary和IList接口,并且都是实现为显示接口成员,这两个接口有一些方法是同名的,比如Remove方法,一个是void IList.Remove (object value),另一个是void IDictionary.Remove (object key)。尽管一个JsonData对象不可能即是数组又是键值对,但是直接调用Remove的时候还是要转换到相应的接口。这个和lua的table相比还是不太方便。当然了,即便不是同名的接口,由于都实现为显示接口成员了,还是必须转型到接口才能调用。
- 不支持取值转型到ulong等类型
JsonData取值时的转型,只支持几种有限的类型,没有ulong等无符号类型的转换函数。如果想把取得的值转型到一个ulong,例如:
ulong value;
value = (ulong)some_data["key"];
结果是会调用到Double的转型函数,如果key对应的value不是一个double则会产生InvalidCastException。
- 要解析的string里面不能包含0值
我们遇到的一个bug是,服务端传过来的Json字符串末尾人为的加了一个’/0’,结果JsonMapper.ToObject就挂了。LitJson可能认为一个c#字符串中不应该包含’/0’,所以他没有处理这种情况,对于不能处理的字符他抛出了一个异常。尽管人为加’/0’是没必要的,但是这显然也是LitJson实现时考虑不周全。
边栏推荐
猜你喜欢
JSP第二篇 -----JSP浅聊EL表达式第二篇:EL表达式中的运算符
What are the benefits of knowledge sharing for businesses?
如何用WebSocket打造Web端IM即时通讯聊天
What are the latest developments in the handling of false information?KDD2022 "Fighting Misinformation and Responding to Media Bias" tutorial, 161 pages ppt
互联网技术从业者怎么解决系统高并发?
曲面着色器初试--地面轨迹模拟(部分细节不完善)
梅科尔工作室OpenHarmony设备开发培训笔记-第一章学习笔记
自然堂品牌焕新升级,携手代言人王一博彰显美妆年轻新态度
IJCAI 2022 | 图神经网络可以检测到异常吗?
网络工程师怎么系统性学习?这份网工资料包帮你解决
随机推荐
五大理由告诉你为什么开发人员选择代码质量静态分析工具Klocwork来实现软件安全
odoo login layout adjustment
RADIUS服务器的演变过程
电脑win键没有反应(最全方案)
1259 Alice and Bob
2022年云商店联合营销市场发展基金(MDF)介绍
场外基金开户在手机办理安全吗?
书法家唐效奇
Cesium中自定义材质material
我们为什么要远离Service Mesh
openEuler 资源利用率提升之道02:典型应用下的效果
工程 (六) ——PointNet点云分类
openEuler 资源利用率提升之道02:典型应用下的效果
快速搭建SSM框架
投资基金定投安全吗
文档管理系统对于企业来说有哪些作用?
方舟基础物品指令代码大全
黑猫带你学Makefile第1篇:什么是Makefile
使用dedecms自带采集功能的文字过滤与替换
What are the role of document management system for companies?