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使用中的一些问题相关推荐

  1. Unity之使用LitJson做游戏存档

    参考这位哥的文章https://blog.csdn.net/BillCYJ/article/details/79888614,比较各种存档方法的优劣,最后我选了LitJson,但是实际使用中仍然遇到了 ...

  2. Ajax+SpringBoot+Thymeleaf使用中遇到的跳转页面问题

    前言:这周在使用 Ajax+Thymeleaf 时遇到一个问题,折腾了我很久,在此记录一下 Ajax+SpringBoot+Thymeleaf使用中遇到的跳转页面问题 问题描述 我的目的:通过 Aja ...

  3. VMware出现“该虚拟机似乎正在使用中 请获取所有权”

    1.找到VMware所在的项目文件,其中有一个名为:Ubuntu 64 位.vmx.lck 2.将其Ubuntu 64 位.vmx.lck改名为Ubuntu 64 位.vmx.lck.back(为了安 ...

  4. AjaxPro.2.dll在VS2005使用中的基本使用

    个人常用的东西收集起来,也给大家一起分享哈.AjaxPro.2.dll在VS2005使用中的基本使用,下面介绍了基本的配置和最简单的使用方法 AJAX不用说大家都明白,不明白的请百度或Google一下 ...

  5. 晶体管参数在实际使用中的意义

    转载自:http://forum.eet-cn.com/blog_index.jspa?blog_id=728&viewall=true,感谢香雪茶,推荐阅读! 做模拟电路的工程师,都有过使用 ...

  6. Windows usb设备正在使用中

    每次插上u盘之后,弹出的时候,总是提示正在使用中.后来我发现了技巧, 1.打开任务管理器 2.打开底部的 打开资源监视器 按钮 3.然后点击磁盘 4.再次弹出usb 就可以弹出了.

  7. 【Bug档案01】Spring Boot的控制器+thymeleaf模板 -使用中出现静态资源加载路径不当的问题 -解决时间:3h

    [Bug档案01]Spring Boot的控制器+thymeleaf模板 -使用中出现静态资源加载路径不当的问题 -解决时间:3h 参考文章: (1)[Bug档案01]Spring Boot的控制器+ ...

  8. lombok使用中出现继承关系的对象时,出现的问题及解决办法

    lombok使用中出现继承关系的对象时,出现的问题及解决办法 参考文章: (1)lombok使用中出现继承关系的对象时,出现的问题及解决办法 (2)https://www.cnblogs.com/h- ...

  9. idae中spring mvc解决问题application context not configured for this file于spring框架使用中的原因

    idae中spring mvc解决问题application context not configured for this file于spring框架使用中的原因 参考文章: (1)idae中spr ...

  10. 优盘中发现计算机病毒怎么办,【网警课堂】教你解决U盘使用中出现的各种问题!...

    原标题:[网警课堂]教你解决U盘使用中出现的各种问题! 在使用U盘的时候,我们经常会遇到各种问题.当我们遇到各种U盘问题时,该怎么办呢?今天文哥给大家分享一些解决U盘使用中出现相关问题的解决方法. 一 ...

最新文章

  1. JEECMS V3.0 常用标签使用说明
  2. oracle创建数据库、表空间、用户并授权
  3. Kali国内源更新sources.list
  4. android4.0 SystemUi系统状态栏
  5. 面试题整理18 根据上排给出十个数,在其下排填出对应的十个数
  6. 加固前奏2-替换application
  7. 自定义的plot函数参数date坐标模型[x,y]的使用建议
  8. BMP图片读写接口函数
  9. mybatis plus关联查询_Mybatis 和 Hibernate 持久层框架之间的区别是啥?
  10. 华铭智能属于芯片概念吗_华铭智能:子公司1个亿参股边缘计算独角兽九次方大数据!...
  11. 快速搭建Python开发环境
  12. C#中制作启动窗体的方法和问题
  13. python筛选同义词_Python-比较同义词NLTK
  14. 多组两两比较用什么检验方法_SPSS教程:多个组比较(Fisher精确检验)及组间两两比较...
  15. [数据分析] [保姆级教程] 数据差异分析方法
  16. 好玩的猜数游戏(不是二分查找!四位数)
  17. 鹏业安装三维算量软件——批量修改工程量
  18. 习题答案-(整理)图书馆的预定图书子系统有如下功能。。。
  19. TensorFlow Eager 教程(转)
  20. 驱动篇 -- PMOS管应用

热门文章

  1. 群体智能优化算法之粒子群优化算法
  2. Windows CE 5.0 五笔输入法
  3. OpenHarmony啃论文俱乐部玩法攻略
  4. 时速云Kubernetes进阶培训 第三期
  5. 如何做到24小时监控某个网页,在网页变化或者更新的时候第一时间接到通知
  6. MOV 和MOVS 这两条指令有什么区别?
  7. SaaS服务和个性化需求,就不能鱼和熊掌兼得吗?
  8. JAVA环境变量的设置及修改
  9. windows优化大师怎么用_曾经辉煌的装机必备软件,你用过几个?
  10. phpcms v9 开发笔记