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


推荐阅读
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
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社区 版权所有