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


推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 网络攻防实战:从HTTP到HTTPS的演变
    本文通过一系列日记记录了从发现漏洞到逐步加强安全措施的过程,探讨了如何应对网络攻击并最终实现全面的安全防护。 ... [详细]
  • 2023 ARM嵌入式系统全国技术巡讲旨在分享ARM公司在半导体知识产权(IP)领域的最新进展。作为全球领先的IP提供商,ARM在嵌入式处理器市场占据主导地位,其产品广泛应用于90%以上的嵌入式设备中。此次巡讲将邀请来自ARM、飞思卡尔以及华清远见教育集团的行业专家,共同探讨当前嵌入式系统的前沿技术和应用。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • Windows服务与数据库交互问题解析
    本文探讨了在Windows 10(64位)环境下开发的Windows服务,旨在定期向本地MS SQL Server (v.11)插入记录。尽管服务已成功安装并运行,但记录并未正确插入。我们将详细分析可能的原因及解决方案。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 本文详细介绍了如何构建一个高效的UI管理系统,集中处理UI页面的打开、关闭、层级管理和页面跳转等问题。通过UIManager统一管理外部切换逻辑,实现功能逻辑分散化和代码复用,支持多人协作开发。 ... [详细]
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社区 版权所有