国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

使用JSONObject時,你需要注意避免的一個問題

移動開發 Android 開發工具
在 Android 業務同步的邏輯代碼中,使用到了 JSONObject 來解析服務端的 JSON 數據。同時本地因為業務新增需求的緣故,在本地數據庫中使用 JSONObject 緩存了包括水位等同步相關的信息,其中,水位值是 Long 型。

[[177050]]

鮑協浩,小米MIUI部門, MIUI基礎應用組通訊錄開發負責人。

 

問題現象

在 Android 業務同步的邏輯代碼中,使用到了 JSONObject 來解析服務端的 JSON 數據。同時本地因為業務新增需求的緣故,在本地數據庫中使用 JSONObject 緩存了包括水位等同步相關的信息,其中,水位值是 Long 型。但近期發現同步過程中下一次同步時,傳遞給服務器的水位并不是上一次服務器返回的新水位,而是相差一些。以 301028292893495297L 為例,服務器返回這個水位之后,下次客戶端上傳的水位是 301028292893495296L,差值為 -1。

問題排查

通過反復排查代碼邏輯,發現水位從服務端返回到下次請求之間,只經過了以下轉換:

認真閱讀代碼不難發現,Long 型的水位值保存在 JSON 對象中的時候被轉成了 String 型,而在讀取的時候又當作是 Long 型來處理。所以就會有精度缺失的問題嗎?馬上參考 JSONObject 的文檔:

 

 

 

 

認真閱讀代碼不難發現,Long 型的水位值保存在 JSON 對象中的時候轉成了 String 型,而在讀取的時候又當作是 Long 型來處理。因此會有精度缺失的問題,參見如下 JSONObject 的文檔:

由此可見,在讀取 JSON 對象的某個值時,如果原先是 String 型,讀取的時候當作是 Long 型,是會將 String 型通過 Double 進行解析的,所以在值超過 2^52 時會有精度缺失的問題。于是,遇到的問題就可以解釋了。以下是 Double 的存儲格式規范:

 

 

 

 

其中,Double 和 Long 的精度測試代碼很簡單(輸入參數可以提供例如 301028292893495297L 這樣超過 2^52 的 long 值,會發現其返回值不為 0):

 

 

 

 

也就是說,在讀取 JSON 對象的某個值時,如果原先是 String 型,讀取的時候當作是 Long 型,是會將 String 型通過 Double 進行解析的,所以在值超過 2^52 時會有精度缺失的問題。

另外,關于 JSON 對象中的值是 Long 型還是 String 型,其實比較容易被忽略。如果JSON 對象在使用 String 表示的時候,該值對應處有引號就是 String 型,否則就是其他類型。看如下的 2 個測試用例就一目了然:

Double 和 Long 的精度測試代碼很簡單(輸入參數可以提供例如 301028292893495297L 這樣超過 2^52 的 long 值):

知道了問題的根源,修復就一目了然了,在水位保存在 JSONObject 對象中時,應該當作 Long 型而不是 String 型來保存;亦或者在讀取的時候也當作是 String 型,然后通過 Long.valueOf 等接口進行解析。

另外,關于 JSON 對象中的值是 Long 型還是 String 型,其實比較容易被忽略。如果JSON 對象在使用 String 表示的時候,該值對應處有引號就是 String 型。看如下的試用例就一目了然了:

類似的問題在網上隨意一搜,其實有許多人遇坑了,比如這個。

 

 

 

 

所以,盡管不能說這個庫的設計是很失敗的,但肯定不算是一個設計良好的庫。因為你無法直接從 API 名稱看出其內在的潛在邏輯,容易導致使用者使用不當。因此,經驗教訓就是:使用第三方庫的時候,能看 API 文檔就看 API 文檔,切不可望文生義。當然,這個問題可能也僅限在 Android 中較老的代碼模塊,畢竟新的代碼都會使用 GSON 等類庫進行 JSON 對象操作,也就不容易出現這樣的不易發現的問題了。

當然,單就這個問題來看,其實是在新增業務邏輯的時候,沒有正確使用 JSONObject 對象的接口,Long 型的值不應當看成是 String 型進行保存而又當成是 Long 型來讀取,如果保存和讀取的接口保持對應,也就不會出現問題了。不管怎么說,該問題的教訓是在使用 JSONObject 相關接口時要倍加小心謹慎。

備注:Github 上***的 JSON-Java 庫沒有這個問題,可以放心使用。

 

 

 

 

問題解決

知道了問題的根源,修復就一目了然了,在水位保存在 JSON 對象中時,應該當作 Long 型而不是 String 型來保存;或者在讀取的時候也當作是 String 型,然后通過 Long.valueOf 等接口進行解析。

問題后話

類似的問題在網上隨意一搜,其實有許多人遇坑了,比如這個。所以,盡管不能說這個庫的設計是很失敗的,但肯定不算是一個設計良好的庫。因為你無法直接從 API 名稱看出內在的潛在邏輯,導致使用不當。因此,經驗教訓就是:使用第三方庫的時候,能看 API 文檔就看 API 文檔,切不可望文生義。

當然,Github 上***的 JSON-Java 庫是沒有這個問題的。

【本文是51CTO專欄“小米開放平臺”的原創文章,“小米開放平臺”微信公眾號:xiaomideveloper】

 

責任編輯:龐桂玉 來源: 小米開放平臺
相關推薦

2016-12-26 18:51:34

AndroidJavascriptJSONObject

2012-07-04 14:40:37

Ajax

2024-05-16 15:15:14

2011-07-26 09:19:27

Objective-C 重載

2023-10-04 00:03:00

SQL數據庫

2010-12-31 09:14:36

MongoDB

2015-10-08 10:07:29

游戲開發內存使用

2021-02-24 07:40:38

React Hooks閉包

2011-12-21 09:54:15

項目經理

2010-06-29 15:54:36

UML建模

2013-09-29 10:36:08

VMware虛擬化

2009-04-23 14:30:19

UML建模

2020-10-26 14:01:22

Java泛型

2021-02-05 17:35:07

數據高管CIO技術

2010-08-09 11:23:24

Flex開發

2010-10-08 09:38:42

mysql修改表

2021-12-30 06:59:28

方法重寫面試

2016-09-23 16:09:01

2014-01-26 14:24:25

開源項目

2017-03-17 11:00:08

數字化陳勇Gartner
點贊
收藏

51CTO技術棧公眾號

精品日韩中文字幕| 久久日韩视频| 亚洲一区国产| 国产精品久久色| 国产视频一区二区视频| 久久国产夜色精品鲁鲁99| 国产真实乱对白精彩久久| 欧美日韩一区二区三区高清| 天天射综合网站| 精品福利在线导航| 李宗瑞系列合集久久| 一区二区中文视频| 久久亚洲精品一区| 国产精品久久精品| 国产精品中文字幕制服诱惑| 中文字幕久精品免费视频| 中文字幕在线看片| 色丁香久综合在线久综合在线观看| 91在线电影| 婷婷亚洲久悠悠色悠在线播放| 国模大尺度私拍在线视频| 夜夜爽夜夜爽精品视频| 999热视频| 国产精品99在线观看| 国产日韩欧美中文| 97天天综合网| 亚洲国产成人精品女人久久久 | 精品综合免费视频观看| 日韩欧美国产高清| 91精品久久久久久久久| 欧美在线高清| 日本一区视频在线观看| 国产黄色在线免费观看| 婷婷亚洲久悠悠色悠在线播放| 免费在线国产| 欧美一区二区三区影视| 神马电影网我不卡| 国内揄拍国内精品少妇国语| 国产精品入口久久| 欧美主播一区二区三区| 免费超碰在线| 亚洲欧美国产精品久久久久久久| 日本免费一区二区三区等视频| 久久69精品久久久久久久电影好 | 国产欧美婷婷中文| 欧洲grand老妇人| 在线亚洲欧美专区二区| 蜜桃av在线免费观看| 日韩电影在线一区| jiyouzz国产精品久久| 男人的天堂日韩| 亚洲综合色网站| 国产九色在线| 青青视频一区二区| 欧美精品一区二区三区蜜桃视频| 成人在线视频播放| 欧美亚洲在线播放| 亚洲一区二区三区高清不卡| 精品视频在线观看一区| 一区二区三区波多野结衣在线观看 | 欧美性三三影院| 在线成人av观看| 亚洲一区二区三区四区在线| av在线三区| 综合激情国产一区| 久久福利综合| 午夜精品久久久久久久99黑人| 亚洲精品小说| 亚洲国产精品无码av| 大桥未久av一区二区三区| 日本乱码一区二区三区不卡| 国产成人黄色av| 青青草成人在线观看| 国产自产v一区二区三区c| 这里只有精品丝袜| 亚洲精品v亚洲精品v日韩精品| 日韩精品综合一本久道在线视频| 日韩av黄色| 国产精品视频在线免费观看| 欧美成人午夜77777| 国产99在线播放| 91免费精品国自产拍在线不卡| 成黄免费在线| 欧美在线视频导航| abab456成人免费网址| 91精品在线观| 久久久久久久久久久久久久久99| 免费av在线| 欧美三级三级三级爽爽爽| 写真福利精品福利在线观看| 国产精品成人观看视频免费| 国产精品理论在线观看| 91久久国产综合久久91猫猫| 国产伦精品一区二区三区免费视频| 日本一区二区在线不卡| 亚洲女同志freevdieo| 国产精品免费视频一区二区 | 91亚洲国产高清| 中国老女人av| 夜夜精品视频| 国产va在线观看| 亚洲欧美在线磁力| 国产精品videossex久久发布| 孩娇小videos精品| 中文日韩在线视频| 亚洲欧洲日本mm| 在线免费国产| 欧美亚洲在线观看| 亚洲影院天堂中文av色| 国产精品免费看久久久无码| 欧美日韩国产综合一区二区| 国产精品欧美三级在线观看| 成人在线激情网| 亚洲精品久久视频| 视频一区二区国产| 黄色免费网站在线观看| 亚洲精品欧美日韩| av激情成人网| 亚洲高清在线播放| 欧美日韩成人综合| 91精品国产乱码久久久久久| 男女18免费网站视频| 66m—66摸成人免费视频| ww久久中文字幕| 国产免费区一区二区三视频免费| 免费网站在线观看视频 | 欧美在线视频二区| 欧美性生活大片视频| 精品国产一区二区三区小蝌蚪| 亚洲天堂2018av| 欧美国产精品日韩| 久久女同性恋中文字幕| 全部a∨一极品视觉盛宴| 欧美激情欧美激情| 国产拍欧美日韩视频二区| 欧美日韩国产网站| 91免费国产精品| 亚洲欧美www| 国产91丝袜在线播放九色| 老司机成人影院| 青青在线视频免费观看| 中文字幕免费精品一区高清| 成人av动漫在线| 蜜臀av午夜一区二区三区| 精品视频999| 日韩vs国产vs欧美| 国产 日韩 欧美一区| 热久久精品国产| 热久久美女精品天天吊色| 亚洲444eee在线观看| 超碰免费在线观看| 久久国产精品久久| 精品国产乱码久久久久久浪潮| 极品少妇xxxx精品少妇| 9999在线精品视频| av电影资源| 欧美高清视频在线观看mv| 中午字幕在线观看| 久久久久久九九九九| 久久精品一区二区三区av| 精品按摩偷拍| 一级毛片高清视频| 国产一区自拍视频| 亚洲国产精品字幕| 精品久久一二三| 97免费资源站| 青青草原av在线| 国产精品成人国产| 亚洲福利专区| 亚洲一二三区不卡| 欧美成人免费一级人片100| 亚洲成人三级| av高清在线| 成人黄色网址在线观看| 欧美gv在线| aaa在线观看| 欧美日韩视频在线播放| av成人app永久免费| 激情文学一区| 青青草97国产精品免费观看 | 欧美另类99xxxxx| 亚洲大片在线观看| 三级成人在线视频| 中文一区二区三区四区| 深夜福利在线看| 女女百合国产免费网站| 日本不卡视频在线播放| 91精品中文字幕一区二区三区| 99久久伊人久久99| 欧美激情视频一区二区三区免费| 国精产品一区一区三区四川| 在线免费观看色| 精品国产三级a∨在线| 国产精品视频午夜| 亚洲性生活视频| 91国偷自产一区二区三区成为亚洲经典 | 国产精品社区| 日韩免费精品| 欧美激情二区| 大香一本蕉伊线亚洲网|