热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

运用JSONObject须要注重防止的一个题目

作者引见:鲍协浩,小米MIUI部门,MIUI基本运用组通讯录开辟负责人题目征象在Android营业同步的逻辑代码中,运用到了JSONObject来剖析服务端的JSON数据。同时当地

作者引见:鲍协浩,小米MIUI部门, MIUI基本运用组通讯录开辟负责人

题目征象

在 Android 营业同步的逻辑代码中,运用到了 JSONObject 来剖析服务端的 JSON 数据。同时当地由于营业新增需求的原因,在当地数据库中运用 JSONObject 缓存了包含水位等同步相干的信息,个中,水位值是 Long 型。但近期发明同步过程当中下一次同步时,传递给服务器的水位并非上一次服务器返回的新水位,而是相差一些。以 301028292893495297L 为例,服务器返回这个水位以后,下次客户端上传的水位是 301028292893495296L,差值为 -1。

题目排查

经由过程重复排查代码逻辑,发明水位从服务端返回到下次要求之间,只经过了以下转换:

《运用 JSONObject 须要注重防止的一个题目》

仔细浏览代码不难发明,Long 型的水位值保留在 JSON 对象中的时刻转成了 String 型,而在读取的时刻又看成是 Long 型来处置惩罚。因而会有精度缺失的题目,拜见以下 JSONObject 的文档:

因而可知,在读取 JSON 对象的某个值时,假如原先是 String 型,读取的时刻看成是 Long 型,是会将 String 型经由过程 Double 举行剖析的,所以在值凌驾 2^52 时会有精度缺失的题目。因而,碰到的题目就能够诠释了。以下是 Double 的存储花样范例:

《运用 JSONObject 须要注重防止的一个题目》

个中,Double 和 Long 的精度测试代码很简单(输入参数能够供应比方 301028292893495297L 如许凌驾 2^52 的 long 值,会发明其返回值不为 0):

《运用 JSONObject 须要注重防止的一个题目》

Double 和 Long 的精度测试代码很简单(输入参数能够供应比方 301028292893495297L 如许凌驾 2^52 的 long 值):

知道了题目的泉源,修复就一览无余了,在水位保留在 JSONObject 对象中时,应该看成 Long 型而不是 String 型来保留;亦或许在读取的时刻也看成是 String 型,然后经由过程 Long.valueOf 等接口举行剖析。

别的,关于 JSON 对象中的值是 Long 型照样 String 型,实在比较轻易被疏忽。假如JSON 对象在运用 String 示意的时刻,该值对应处有引号就是 String 型。看以下的试用例就一览无余了:

《运用 JSONObject 须要注重防止的一个题目》

相似的题目在网上随便一搜,实在有许多人遇坑了,比方这个。

所以,只管不能说这个库的设想是很失利的,但一定不算是一个设想优越的库。由于你没法直接从 API 称号看出其内涵的潜伏逻辑,轻易致使运用者运用不当。因而,经验经验就是:运用第三方库的时刻,能看 API 文档就看 API 文档,切不可望文生义。固然,这个题目能够也仅限在 Android 中较老的代码模块,毕竟新的代码都邑运用 GSON 等类库举行 JSON 对象操纵,也就不轻易涌现如许的不容易发明的题目了。

固然,单就这个题目来看,实际上是在新增营业逻辑的时刻,没有准确运用 JSONObject 对象的接口,Long 型的值不应该看成是 String 型举行保留而又当做是 Long 型来读取,假如保留和读取的接口坚持对应,也就不会涌现题目了。不管怎么说,该题目的经验是在运用 JSONObject 相干接口时要倍加小心谨慎。

备注:Github 上最新的 JSON-Java 库没有这个题目,能够放心运用。

《运用 JSONObject 须要注重防止的一个题目》

题目解决

知道了题目的泉源,修复就一览无余了,在水位保留在 JSON 对象中时,应该看成 Long 型而不是 String 型来保留;或许在读取的时刻也看成是 String 型,然后经由过程 Long.valueOf 等接口举行剖析。

题目后话

相似的题目在网上随便一搜,实在有许多人遇坑了,比方这个。所以,只管不能说这个库的设想是很失利的,但一定不算是一个设想优越的库。由于你没法直接从 API 称号看出内涵的潜伏逻辑,致使运用不当。因而,经验经验就是:运用第三方库的时刻,能看 API 文档就看 API 文档,切不可望文生义。

固然,Github 上最新的 JSON-Java 库是没有这个题目的。

小米开放平台重磅推出小米帐号接入有礼运动:胜利接入小米帐号即可取得小米开放平台免费供应的平台资本(小米运用市肆、小米卡包、小米推送vip、小米帐号同盟等资本),时机不容错过,我们期待您的到场!
运动报名地点:http://dev.xiaomi.com/console…

官方QQ交换群:398616987
想要相识更多?
那就关注我们吧!
《运用 JSONObject 须要注重防止的一个题目》


推荐阅读
  • 本文介绍了UUID(通用唯一标识符)的概念及其在JavaScript中生成Java兼容UUID的代码实现与优化技巧。UUID是一个128位的唯一标识符,广泛应用于分布式系统中以确保唯一性。文章详细探讨了如何利用JavaScript生成符合Java标准的UUID,并提供了多种优化方法,以提高生成效率和兼容性。 ... [详细]
  • 在 Kubernetes 中,Pod 的调度通常由集群的自动调度策略决定,这些策略主要关注资源充足性和负载均衡。然而,在某些场景下,用户可能需要更精细地控制 Pod 的调度行为,例如将特定的服务(如 GitLab)部署到特定节点上,以提高性能或满足特定需求。本文深入解析了 Kubernetes 的亲和性调度机制,并探讨了多种优化策略,帮助用户实现更高效、更灵活的资源管理。 ... [详细]
  • 在 Angular Google Maps 中实现图片嵌入信息窗口的功能,可以通过使用 `@agm/core` 库来实现。该库提供了丰富的 API 和组件,使得开发者可以轻松地在地图上的信息窗口中嵌入图片。本文将详细介绍如何配置和使用这些组件,以实现动态加载和显示图片的功能。此外,还将探讨一些常见的问题和解决方案,帮助开发者更好地集成这一功能。 ... [详细]
  • 投融资周报 | Circle 达成 4 亿美元融资协议,唯一艺术平台 A 轮融资超千万美元 ... [详细]
  • 如何在Mac上构建高效的本地服务器环境
    在Mac上构建高效的本地服务器环境,首先需要了解基本步骤:1. 配置目录基础;2. 启动Apache服务;3. 添加自定义文档至本地服务器;4. 查看自定义效果。此外,还可以通过手机或其他电脑访问本机服务器,以确保跨设备的兼容性和调试效果。Mac系统自带的Apache服务为本地开发提供了便捷的工具,本文将详细介绍每个步骤的具体操作方法。 ... [详细]
  • 探索偶数次幂二项式系数的求和方法及其数学意义 ... [详细]
  • 在VMware虚拟机中部署带有中文图形界面的CentOS 7 Linux系统
    本文详细介绍了在VMware虚拟机中部署带有中文图形界面的CentOS 7 Linux系统的步骤。首先,通过“文件”菜单选择“新建虚拟机”并进入自定义设置。接着,在硬盘兼容性选项中选择默认设置。为了更好地进行Linux操作系统的安装练习,建议选择稍后安装操作系统,并在虚拟机安装完成后,根据实际需求删除不必要的硬件组件。此外,本文还提供了详细的配置参数和注意事项,帮助用户顺利完成整个部署过程。 ... [详细]
  • 设计实战 | 10个Kotlin项目深度解析:首页模块开发详解
    设计实战 | 10个Kotlin项目深度解析:首页模块开发详解 ... [详细]
  • Python 实战:异步爬虫(协程技术)与分布式爬虫(多进程应用)深入解析
    本文将深入探讨 Python 异步爬虫和分布式爬虫的技术细节,重点介绍协程技术和多进程应用在爬虫开发中的实际应用。通过对比多进程和协程的工作原理,帮助读者理解两者在性能和资源利用上的差异,从而在实际项目中做出更合适的选择。文章还将结合具体案例,展示如何高效地实现异步和分布式爬虫,以提升数据抓取的效率和稳定性。 ... [详细]
  • 在 CentOS 6.6 系统中搭建 MONO 和 Jexus 以支持 ASP.NET 及 MVC 应用的运行环境配置指南
    本文提供了在 CentOS 6.6 系统上配置 MONO 和 Jexus 以支持 ASP.NET 及 MVC 应用的详细步骤。首先,确保本机环境为 CentOS 6.6,并使用阿里云的 YUM 源来安装必要的软件包,包括 gcc、gcc-c++、bison、pkgconfig 和 glib2-devel。这些软件包是构建和运行 MONO 环境的基础,确保系统能够顺利支持 ASP.NET 和 MVC 应用的部署和运行。 ... [详细]
  • FastDFS Nginx 扩展模块的源代码解析与技术剖析
    FastDFS Nginx 扩展模块的源代码解析与技术剖析 ... [详细]
  • 本文详细解析了九度编程平台上的斐波那契数列高效算法挑战(题目编号:1387)。该挑战要求在1秒的时间限制和32兆的内存限制下,设计出高效的斐波那契数列计算方法。通过多种算法的对比和性能分析,本文提供了优化方案,帮助参赛者在限定资源条件下实现高效计算。 ... [详细]
  • CentOS 7环境下Jenkins的安装与前后端应用部署详解
    CentOS 7环境下Jenkins的安装与前后端应用部署详解 ... [详细]
  • 在数据库事务处理中,InnoDB 存储引擎提供了多种隔离级别,其中 READ COMMITTED 和 REPEATABLE READ 是两个常用的选项。本文详细对比了这两种隔离级别的特点和差异,不仅从理论角度分析了它们对“脏读”和“幻读”的处理方式,还结合实际应用场景探讨了它们在并发控制和性能表现上的不同。特别关注了行锁机制在不同隔离级别下的行为,为开发者选择合适的隔离级别提供了参考。 ... [详细]
  • 本文探讨了利用Java实现WebSocket实时消息推送技术的方法。与传统的轮询、长连接或短连接等方案相比,WebSocket提供了一种更为高效和低延迟的双向通信机制。通过建立持久连接,服务器能够主动向客户端推送数据,从而实现真正的实时消息传递。此外,本文还介绍了WebSocket在实际应用中的优势和应用场景,并提供了详细的实现步骤和技术细节。 ... [详细]
author-avatar
相对论!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有