LitJson使用中需要注意的一些问题(转)
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实现时考虑不周全。
LitJson使用中需要注意的一些问题(转)的更多相关文章
- LitJson使用中的一些问题
http://blog.csdn.net/n5/article/details/45030063
- ORA-02020 : 过多的数据库链接在使用中-Windows环境解决步骤
一.现象 编译存储过程时报ORA-02020错误. 错误详细信息:ORA-04052在查找远程对象 xx@yy时出错 ORA-00604 : 递归 SQL 级别 1 出现错误 ORA-02020 : ...
- Subsonic使用中
使用中,遇到各种奇葩问题,依依汇总. 1.引用了Subsonic层后,一运行就开始报错,提示未能找到文件!! //引用后,目标框架可能会被改变,subsonic的默认框架是2.0,请检查框架是否 ...
- mysqldump 备份命令使用中的一些经验总结
mysqldump的一个小坑(自测) 正文:经常使用接触mysql复制功能的朋友应该对mysqldump命令不陌生吧,鄙人最近也在研究学习这一块的内容,经过几天的测试,发现mysqldump使用中容易 ...
- <总结>delphi WebBrowser控件的使用中出现的bug
Delphi WebBrowser控件的使用中出现的bug: 1.WebBrowser.Visible=false:Visible属性不能使WebBrowser控件不可见,暂时用 WebBrowse ...
- SSH框架使用中存在的诡异异常
背景 相信大多数人目前都在使用Spring + Struts2/SpringMVC + Hibernate来构建项目的整体架构,但是在使用中经藏会遇到一些诡异的问题,不知道如果解决,今天我遇到了一个非 ...
- VM出现该虚拟机正在使用中的提示,让获取所有权限解决办法
今天打开虚拟机正要学习,结果说是虚拟机似乎正在使用中,让我重新获取权限.解决办法:打开提示的配置文件的位置,将一个以.lck结尾的文件夹删除或者保存为另外的文件名称,再打开虚拟机就OK了.
- 在引用KindEditor编辑器时,运行时出现以下错误:错误46 找不到类型或命名空间名称“LitJson”(是否缺少 using 指令或程序集引用?)
将asp.net下bin文件夹下的文件LitJSON.dll拷贝到工程的bin目录下,并在工程中添加引用 在后台加入: using LitJson;
- 关于litJson的System.InvalidCastException
最近在做一个Unity3D的项目,用到了litJson库, 它比JavaScript里的JSON解析更加严格, 有时候解析数据的时候会出现类型不对. 比如说 {"data":12} ...
随机推荐
- HTTP协议简要介绍
1. 网络基础 TCP/IP 通常使用的网络是在TCP/IP协议簇基础上运作的. HTTP属于它内部的一个子集. TCP/IP分为4个层次, 应用层, 传输层, 网络层, 链路层. (Applicat ...
- MySQL之存储引擎(Day39)
一 什么是存储引擎 mysql中建立的库=====>文件夹 库中建立的表=====>文件 现实生活中我们用来存储数据的文件应该有不同的类型:比如存文本用txt类型,存表格用excel,存图 ...
- CNN学习笔记:卷积神经网络
CNN学习笔记:卷积神经网络 卷积神经网络 基本结构 卷积神经网络是一种层次模型,其输入是原始数据,如RGB图像.音频等.卷积神经网络通过卷积(convolution)操作.汇合(pooling)操作 ...
- LeetCode:N叉树的后序遍历【590】
LeetCode:N叉树的后序遍历[590] 题目描述 给定一个 N 叉树,返回其节点值的后序遍历. 例如,给定一个 3叉树 : 返回其后序遍历: [5,6,3,2,4,1]. 题目分析 这道题有好几 ...
- c9.io
老常时间没写了,这次是真碰到心动的东西了,赶快给大家奉献上来. (先上图!) (Cloud9 IDE,云端IDE,简单一点就是运行在浏览器中的IDE,你不需要安装任何东西, 只要打开任何一个浏览器,甚 ...
- 并发-CountDownLatch、CyclicBarrier和Semaphore
CountDownLatch.CyclicBarrier和Semaphore 参考: http://www.cnblogs.com/dolphin0520/p/3920397.html https:/ ...
- 编程练习赛11B 物品价值(装压dp)
题意:每个物品有m(m<=10)种属性和一个价格,你有n种物品从中任意选择一些物品,让每种属性恰好有奇数个物品拥有,输出满足条件的最大价值和 题解:一看就是明显的01背包问题,但是价格乘以个数的 ...
- aliyun阿里云Maven仓库地址——加速你的maven构建 - 转载
maven仓库用过的人都知道,国内有多么的悲催.还好有比较好用的镜像可以使用,尽快记录下来.速度提升100倍. http://maven.aliyun.com/nexus/#view-reposito ...
- Android--第三方控件--okHttp
Android中有很多的第三方控件,其中OkHttp是一个很强大的用于网络加载的第三方框架,当然了,它的内部也是使用原生的代码封装好的.今天我们就来看一下OkHttp的简单用法: 说到网络请求,肯定就 ...
- FckEditor 配置手册中文教程详细说明
http://www.jb51.net/article/17965.htm 首先,FCKEDITOR的性能是非常好的,用户只需很少的时间就可以载入 FCKEDITOR所需文件.对于其他在线编辑器来说, ...