LitJson使用中需要注意的一些问题(转)
2015-10-20 15:46
736 查看
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实现时考虑不周全。
相关文章推荐
- JSF与JSP的区别
- js中的replace
- javascript模板
- js中的||{}
- js 函数function用法
- JSF生命周期
- fastjson解析json数据
- 本期介绍SBJson的用法,收集。
- javascript省市级联功能实现方法实例详解
- 常见的正则表达式问题
- prototypejs库Function#wrap()的使用和源码解析
- 基于JavaScript实现移动端TAB触屏切换效果
- js点击文本框后才加载验证码实例代码
- 深入理解JavaScript原型:prototype,__proto__和constructor
- javascript实现状态栏中文字动态显示的方法
- js生成验证码并验证
- JavaScript第一天
- javascript queue 打字效果
- JavaScript面向对象之Prototypes和继承
- JavaScript 闭包详解