当前位置:网站首页>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实现时考虑不周全。
边栏推荐
猜你喜欢

面试面到自闭,字节软件测试岗五轮面试,四个小时灵魂拷问...

“12306” 的架构到底有多牛逼?

推荐系统如何可信?罗格斯大学最新《可信推荐系统》综述,43页pdf阐述可信RS组成与技术

方舟开服务器教程——开服配置常见问题及解决方法

riscv-gnu-toolchain下载安装

信号与系统【x(t)*h(t)=y(t) 求h(t)】附matlab代码

室外光纤资源管理——可视化管理平台

Why Manufacturing Companies Should Deploy Digital Factory Systems

What are the role of document management system for companies?

From interview to autism, five rounds of interviews for byte software testing post, four hours of soul torture...
随机推荐
性能问题从发现到优化一般思路
IJCAI 2022 | Can Graph Neural Networks Detect Anomalies?
PHP解析json数据,显示
测试面试题锦集
PyTorch入门(六):模型的训练套路
学习与尝试 --> 事件风暴
Word清除格式在哪里?Word清除格式使用方法
wps表格怎么设置公式自动计算?wps表格设置公式自动计算的方法
LeetCode_2_两数相加
Why Manufacturing Companies Should Deploy Digital Factory Systems
堆排序实现代码
莅临GOPS大会龙智展位,获取Forrester最新报告:《Forrester Wave:2021年第四季度企业服务管理报告》
挖财学堂帮开通的证券账户是真的吗?安全吗
PyTorch入门:(二)Tensorboard的使用
PyTorch入门:(五)模型的搭建
买股票安全吗 资金能取出来吗
CVPR 2022 ActivityNet竞赛冠军:中科院深圳先进院提出高低分双模态行为识别框架
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception
快速搭建SSM框架
虚假信息处理最新有何进展?KDD2022《打击错误信息和应对媒体偏见》教程,161页ppt