前端關於JSON.parse解析報錯問題的避坑指南


#文 一像素 

問題描述

對於深度嵌套的JSON字符串,使用 JSON.parse 進行解析時,會出現代碼錯誤

示例1

簡單模擬一下報錯的過程

 

經過上述步驟,我們得到了一個結果,基於JSON.stringify轉義的2層嵌套的JSON字符串:'{"b":"{\"a\":\"a123\"}"}',這個結果是不是看起來沒問題

但是當我們嘗試使用JSON.parse 解析該字符串,則會出現報錯如下圖所示:

示例2

值得注意的是,當我們直接使用 示例1 中的 變量json2進行解析時,有是可以正確進行解析的

示例3

這表明,json2 實質上並不等同於字符串:'{"b":"{\"a\":\"a123\"}"}' ,下面執行結果可以證明:

 

 

由此可以斷定,此種情況下,json2的表達結果與變量本身並不相符,即當使用JSON.parse解析 '{"b":"{\"a\":\"a123\"}"}' 這一字面量聲明的字符串時,實際上改JSON串是缺少一層 “\” 轉義的。

實測結果包含但不限於上述示例所表述的這一種格式,還包括使用 [ ] 數組包裹的格式,\n 特殊字符等格式,均會引發解析異常。另外,這一解析錯誤不只會發生在前端,對於后端解析也會發生錯誤

解決方案

對於上述情況,有如下幾種解決方案:

1. 規范JSON字符串的嵌套格式,防止或避免嵌套

2. 對於被嵌套的字符串,采取轉義處理

3. 使用正則進行報錯格式和特殊字符的替換

 

方案具體實現分析及示例

1. 規范JSON字符串的嵌套格式,防止或避免嵌套

對於數據源頭發生在前端邏輯的點,可以通過規范格式來防止JSON字符串多層嵌套問題的發生

示例1 中的 json2 數據,轉化為 示例4 所示,傳輸和解析過程就不會出錯了

示例4

 

對於多層JSON的組裝,我用了一個方法來進行處理,供大家參考

示例5

 

多個值需要處理時可重復使用:

示例6

 

因為解析錯誤的情況是多端都可能發生的,如數據生成的源頭在后端,必要的情況下,我們也可以要求他們返回給我們規范的格式

 

2. 對於被嵌套的字符串,采取轉義處理 

使用 encodeURIComponent、escape、btoa等對嵌套內容進行轉碼,使用時再進行解碼即可

開頭 示例1 的數據,可以寫成

示例7

 

要注意的是,該方案可能需要前后端共同編解碼處理,視具體邏輯決定

 

3. 使用正則進行報錯格式和特殊字符的替換

對於JSON解析報錯的處理,推薦使用方案1和2,如果仍堅持多層嵌套的格式,那么可以使用正則進行報錯格式和特殊字符的替換 ,原理就是期望把 示例1 中的格式,強行替換為 示例4 的格式,以防止報錯

對於此類情況我也提供了JSON字符串轉化的公共方法供大家參考,集成了最常見的報錯格式的正則替換

示例8

方法中的正則替換如存在不夠全面或轉化不正確的情況,歡迎大家提出建議和指正

事實上,即使上述方法足夠完善,仍不推薦使用該方案,因為在復雜數據格式的情況下,正則替換仍可能存在一定概率不可預見的錯誤。

以上是我在項目開發中遇到這一問題和處理方案總結,如大家有更好的想法或建議,歡迎大家積極提議,期待與大家的討論

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM