這篇文章給大家分享的是有關(guān)使用JSONObject需要注意避免什么問題的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:主機(jī)域名、網(wǎng)絡(luò)空間、營銷軟件、網(wǎng)站建設(shè)、雁江網(wǎng)站維護(hù)、網(wǎng)站推廣。
問題現(xiàn)象
在 Android 業(yè)務(wù)同步的邏輯代碼中,使用到了 JSONObject 來解析服務(wù)端的 JSON 數(shù)據(jù)。同時(shí)本地因?yàn)闃I(yè)務(wù)新增需求的緣故,在本地?cái)?shù)據(jù)庫中使用 JSONObject 緩存了包括水位等同步相關(guān)的信息,其中,水位值是 Long 型。但近期發(fā)現(xiàn)同步過程中下一次同步時(shí),傳遞給服務(wù)器的水位并不是上一次服務(wù)器返回的新水位,而是相差一些。以 301028292893495297L 為例,服務(wù)器返回這個(gè)水位之后,下次客戶端上傳的水位是 301028292893495296L,差值為 -1。
問題排查
通過反復(fù)排查代碼邏輯,發(fā)現(xiàn)水位從服務(wù)端返回到下次請求之間,只經(jīng)過了以下轉(zhuǎn)換:
認(rèn)真閱讀代碼不難發(fā)現(xiàn),Long 型的水位值保存在 JSON 對象中的時(shí)候轉(zhuǎn)成了 String 型,而在讀取的時(shí)候又當(dāng)作是 Long 型來處理。因此會有精度缺失的問題,參見如下 JSONObject 的文檔:
由此可見,在讀取 JSON 對象的某個(gè)值時(shí),如果原先是 String 型,讀取的時(shí)候當(dāng)作是 Long 型,是會將 String 型通過 Double 進(jìn)行解析的,所以在值超過 2^52 時(shí)會有精度缺失的問題。于是,遇到的問題就可以解釋了。以下是 Double 的存儲格式規(guī)范:
其中,Double 和 Long 的精度測試代碼很簡單(輸入?yún)?shù)可以提供例如 301028292893495297L 這樣超過 2^52 的 long 值,會發(fā)現(xiàn)其返回值不為 0):
Double 和 Long 的精度測試代碼很簡單(輸入?yún)?shù)可以提供例如 301028292893495297L 這樣超過 2^52 的 long 值):
知道了問題的根源,修復(fù)就一目了然了,在水位保存在 JSONObject 對象中時(shí),應(yīng)該當(dāng)作 Long 型而不是 String 型來保存;亦或者在讀取的時(shí)候也當(dāng)作是 String 型,然后通過 Long.valueOf 等接口進(jìn)行解析。
另外,關(guān)于 JSON 對象中的值是 Long 型還是 String 型,其實(shí)比較容易被忽略。如果JSON 對象在使用 String 表示的時(shí)候,該值對應(yīng)處有引號就是 String 型??慈缦碌脑囉美鸵荒苛巳涣耍?/p>
類似的問題在網(wǎng)上隨意一搜,其實(shí)有許多人遇坑了,比如這個(gè)。
所以,盡管不能說這個(gè)庫的設(shè)計(jì)是很失敗的,但肯定不算是一個(gè)設(shè)計(jì)良好的庫。因?yàn)槟銦o法直接從 API 名稱看出其內(nèi)在的潛在邏輯,容易導(dǎo)致使用者使用不當(dāng)。因此,經(jīng)驗(yàn)教訓(xùn)就是:使用第三方庫的時(shí)候,能看 API 文檔就看 API 文檔,切不可望文生義。當(dāng)然,這個(gè)問題可能也僅限在 Android 中較老的代碼模塊,畢竟新的代碼都會使用 GSON 等類庫進(jìn)行 JSON 對象操作,也就不容易出現(xiàn)這樣的不易發(fā)現(xiàn)的問題了。
當(dāng)然,單就這個(gè)問題來看,其實(shí)是在新增業(yè)務(wù)邏輯的時(shí)候,沒有正確使用 JSONObject 對象的接口,Long 型的值不應(yīng)當(dāng)看成是 String 型進(jìn)行保存而又當(dāng)成是 Long 型來讀取,如果保存和讀取的接口保持對應(yīng),也就不會出現(xiàn)問題了。不管怎么說,該問題的教訓(xùn)是在使用 JSONObject 相關(guān)接口時(shí)要倍加小心謹(jǐn)慎。
備注:Github 上***的 JSON-Java 庫沒有這個(gè)問題,可以放心使用。
問題解決
知道了問題的根源,修復(fù)就一目了然了,在水位保存在 JSON 對象中時(shí),應(yīng)該當(dāng)作 Long 型而不是 String 型來保存;或者在讀取的時(shí)候也當(dāng)作是 String 型,然后通過 Long.valueOf 等接口進(jìn)行解析。
感謝各位的閱讀!關(guān)于“使用JSONObject需要注意避免什么問題”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
文章標(biāo)題:使用JSONObject需要注意避免什么問題
分享網(wǎng)址:http://redsoil1982.com.cn/article10/jhegdo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號、企業(yè)網(wǎng)站制作、軟件開發(fā)、搜索引擎優(yōu)化、動態(tài)網(wǎng)站、響應(yīng)式網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)