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


推荐阅读
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 网络攻防实战:从HTTP到HTTPS的演变
    本文通过一系列日记记录了从发现漏洞到逐步加强安全措施的过程,探讨了如何应对网络攻击并最终实现全面的安全防护。 ... [详细]
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 本文探讨了如何在编程中正确处理包含空数组的 JSON 对象,提供了详细的代码示例和解决方案。 ... [详细]
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社区 版权所有