最近在小程序的开发过程当中,遇到一个神奇的问题。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
类型时的判断和容错代码。