微信小程序 wx.request 對於 JSON 含 \u2028 處理異常

問題描述

最近在小程序的開發過程當中,遇到一個神奇的問題。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 });
    },
});

結果:微信

  1. 在 開發者工具 中,能正常解析
    圖片描述
  2. 在 真機(iOS 和 Android),都解析失敗
    圖片描述

u2028

該特殊字符就是 \u2028,解析爲行分隔符。
該字符,在 JSON 字符串中,是被兼容的,是能被 JSON.parse 正常解析的。
可是 JS 代碼中有這個字符串,就會致使運行出錯。網絡

爲何真機和開發者工具表現不一致

微信小程序運行在三端:iOS、Android 和 用於調試的開發者工具。
三端的JS腳本執行環境是各不相同的:app

  • 在 iOS 上,小程序的 javascript 代碼是運行在 JavaScriptCore 中。
  • 在 Android 上,小程序的 javascript 代碼是經過 X5 JSCore來解析。
  • 在 開發工具上, 小程序的 javascript 代碼是運行在 nwjs 中。

而小程序的邏輯層和視圖層,都是經過「WeixinJsBridge」來調用 Native API 的。工具

圖片描述

因此問題出在,wx.request 對於響應體的數據處理,究竟是在 JS Engine 處理的,仍是 Native 處理的,在微信不公開小程序源碼的狀況下,不得而知。

wx.request 的處理對於咱們來講,至關於黑盒,而且對於 res.data 的數據類型可能值是多種的,若是想在業務上提供更好的健壯性,還須要兼容 res.dataObject/String 類型時的判斷和容錯代碼。

參考

微信小程序運行流程看這篇就夠了

相關文章
相關標籤/搜索