#文 一像素
問題描述
對於深度嵌套的JSON字符串,使用 JSON.parse 進行解析時,會出現代碼錯誤
簡單模擬一下報錯的過程

經過上述步驟,我們得到了一個結果,基於JSON.stringify轉義的2層嵌套的JSON字符串:'{"b":"{\"a\":\"a123\"}"}',這個結果是不是看起來沒問題
但是當我們嘗試使用JSON.parse 解析該字符串,則會出現報錯如下圖所示:

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

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

由此可以斷定,此種情況下,json2的表達結果與變量本身並不相符,即當使用JSON.parse解析 '{"b":"{\"a\":\"a123\"}"}' 這一字面量聲明的字符串時,實際上改JSON串是缺少一層 “\” 轉義的。
實測結果包含但不限於上述示例所表述的這一種格式,還包括使用 [ ] 數組包裹的格式,\n 特殊字符等格式,均會引發解析異常。另外,這一解析錯誤不只會發生在前端,對於后端解析也會發生錯誤
解決方案
對於上述情況,有如下幾種解決方案:
1. 規范JSON字符串的嵌套格式,防止或避免嵌套
2. 對於被嵌套的字符串,采取轉義處理
3. 使用正則進行報錯格式和特殊字符的替換
方案具體實現分析及示例
1. 規范JSON字符串的嵌套格式,防止或避免嵌套
對於數據源頭發生在前端邏輯的點,可以通過規范格式來防止JSON字符串多層嵌套問題的發生
如 示例1 中的 json2 數據,轉化為 示例4 所示,傳輸和解析過程就不會出錯了

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

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

因為解析錯誤的情況是多端都可能發生的,如數據生成的源頭在后端,必要的情況下,我們也可以要求他們返回給我們規范的格式
2. 對於被嵌套的字符串,采取轉義處理
使用 encodeURIComponent、escape、btoa等對嵌套內容進行轉碼,使用時再進行解碼即可
開頭 示例1 的數據,可以寫成

要注意的是,該方案可能需要前后端共同編解碼處理,視具體邏輯決定
3. 使用正則進行報錯格式和特殊字符的替換
對於JSON解析報錯的處理,推薦使用方案1和2,如果仍堅持多層嵌套的格式,那么可以使用正則進行報錯格式和特殊字符的替換 ,原理就是期望把 示例1 中的格式,強行替換為 示例4 的格式,以防止報錯
對於此類情況我也提供了JSON字符串轉化的公共方法供大家參考,集成了最常見的報錯格式的正則替換

方法中的正則替換如存在不夠全面或轉化不正確的情況,歡迎大家提出建議和指正
事實上,即使上述方法足夠完善,仍不推薦使用該方案,因為在復雜數據格式的情況下,正則替換仍可能存在一定概率不可預見的錯誤。
以上是我在項目開發中遇到這一問題和處理方案總結,如大家有更好的想法或建議,歡迎大家積極提議,期待與大家的討論

