最近在小程序的開發過程當中,遇到一個神奇的問題。javascript
小程序用於發起網絡請求的 API wx.request 默認會對爲 JSON 格式的響應體進行解析,返回 JS Object。php
wx.request({ url: 'test.php', //僅爲示例,並不是真實的接口地址 data: { x: '', y: '' }, header: { 'content-type': 'application/json' // 默認值 }, success: function(res) { console.log(res.data) } })
其中 res.data
通常會是 Object 類型。java
可是,響應體的 JSON 數據包含了 \\u2028
的字符,就會解釋失敗,輸出的 res.data
是響應體的字符串類型。json
測試樣本:{「test」:」這裏有一個特殊字符:
"}
小程序
測試代碼:微信小程序
wx.request({ ... success: (res) => { console.log('APIFactory:run', '調試', { res }); }, });
結果:微信
該特殊字符就是 \u2028
,解析爲行分隔符。
該字符,在 JSON 字符串中,是被兼容的,是能被 JSON.parse
正常解析的。
可是 JS 代碼中有這個字符串,就會致使運行出錯。網絡
微信小程序運行在三端:iOS、Android 和 用於調試的開發者工具。
三端的JS腳本執行環境是各不相同的:app
而小程序的邏輯層和視圖層,都是經過「WeixinJsBridge」來調用 Native API 的。工具
因此問題出在,wx.request
對於響應體的數據處理,究竟是在 JS Engine 處理的,仍是 Native 處理的,在微信不公開小程序源碼的狀況下,不得而知。
wx.request
的處理對於咱們來講,至關於黑盒,而且對於 res.data
的數據類型可能值是多種的,若是想在業務上提供更好的健壯性,還須要兼容 res.data
爲 Object/String
類型時的判斷和容錯代碼。