热门标签 | 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 须要注重防止的一个题目》


推荐阅读
  • 本文详细介绍了Ionic框架的使用方法及其与Angular的集成。Ionic框架是一个强大的前端开发工具,适用于构建跨平台的移动应用程序。文章将探讨如何引入必要的CSS和JavaScript文件,并解释bundle.js中包含的核心功能,如路由等。 ... [详细]
  • 本题探讨了在一个有向图中,如何根据特定规则将城市划分为若干个区域,使得每个区域内的城市之间能够相互到达,并且划分的区域数量最少。题目提供了时间限制和内存限制,要求在给定的城市和道路信息下,计算出最少需要划分的区域数量。 ... [详细]
  • 本文详细探讨了HTML表单中GET和POST请求的区别,包括它们的工作原理、数据传输方式、安全性及适用场景。同时,通过实例展示了如何在Servlet中处理这两种请求。 ... [详细]
  • Hybrid 应用的后台接口与管理界面优化
    本文探讨了如何通过优化 Hybrid 应用的后台接口和管理界面,提升用户体验。特别是在首次加载 H5 页面时,为了减少用户等待时间和流量消耗,介绍了离线资源包的管理和分发机制。 ... [详细]
  • 本文探讨了Java编程的核心要素,特别是其面向对象的特性,并详细介绍了Java虚拟机、类装载器体系结构、Java类文件和Java API等关键技术。这些技术使得Java成为一种功能强大且易于使用的编程语言。 ... [详细]
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
  • 本文介绍了如何使用JavaScript的Fetch API与Express服务器进行交互,涵盖了GET、POST、PUT和DELETE请求的实现,并展示了如何处理JSON响应。 ... [详细]
  • 开发笔记:9.八大排序
    开发笔记:9.八大排序 ... [详细]
  • MySQL 高性能实战教程
    本课程深入探讨 MySQL 的架构、性能调优、索引优化、查询优化及高可用性等关键领域。通过实际案例和详细讲解,帮助学员掌握提升 MySQL 数据库性能的方法与技巧。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 本问题探讨了在特定条件下排列儿童队伍的方法数量。题目要求计算满足条件的队伍排列总数,并使用递推算法和大数处理技术来解决这一问题。 ... [详细]
  • Netflix利用Druid实现高效实时数据分析
    本文探讨了全球领先的在线娱乐公司Netflix如何通过采用Apache Druid,实现了高效的数据采集、处理和实时分析,从而显著提升了用户体验和业务决策的准确性。文章详细介绍了Netflix在系统架构、数据摄取、管理和查询方面的实践,并展示了Druid在大规模数据处理中的卓越性能。 ... [详细]
  • JavaScript 基础语法指南
    本文详细介绍了 JavaScript 的基础语法,包括变量、数据类型、运算符、语句和函数等内容,旨在为初学者提供全面的入门指导。 ... [详细]
  • 本文介绍如何使用 Android 的 Canvas 和 View 组件创建一个简单的绘图板应用程序,支持触摸绘画和保存图片功能。 ... [详细]
  • 本文将探讨Java编程语言中对象和类的核心概念,帮助读者更好地理解和应用面向对象编程的思想。通过实际例子和代码演示,我们将揭示如何在Java中定义、创建和使用对象。 ... [详细]
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社区 版权所有