微信小程序 wx.request 对于 JSON 含 \u2028 处理异常

问题描述

最近在小程序的开发过程中,遇到一个神奇的问题。

小程序用于发起网络请求的 API wx.request 默认会对为 JSON 格式的响应体进行解析,返回 JS Object。

wx.request({
    url: 'test.php', //仅为示例,并非真实的接口地址
    data: {
        x: '',
        y: ''
    },
    header: {
        'content-type': 'application/json' // 默认值
    },
    success: function(res) {
        console.log(res.data)
    }
})

其中 res.data 一般会是 Object 类型。

但是,响应体的 JSON 数据包含了 \\u2028 的字符,就会解释失败,输出的 res.data 是响应体的字符串类型。

样本

测试样本:{“test”:”这里有一个特殊字符:
 "}

测试代码:

wx.request({
    ...
    success: (res) => {
        console.log('APIFactory:run', '调试', { res });
    },
});

结果:

  1. 在 开发者工具 中,能正常解析
    图片描述
  2. 在 真机(iOS 和 Android),都解析失败
    图片描述

u2028

该特殊字符就是 \u2028,解析为行分隔符。
该字符,在 JSON 字符串中,是被兼容的,是能被 JSON.parse 正常解析的。
但是 JS 代码中有这个字符串,就会导致运行出错。

为什么真机和开发者工具表现不一致

微信小程序运行在三端:iOS、Android 和 用于调试的开发者工具。
三端的JS脚本执行环境是各不相同的:

  • 在 iOS 上,小程序的 javascript 代码是运行在 JavaScriptCore 中。
  • 在 Android 上,小程序的 javascript 代码是通过 X5 JSCore来解析。
  • 在 开发工具上, 小程序的 javascript 代码是运行在 nwjs 中。

而小程序的逻辑层和视图层,都是通过「WeixinJsBridge」来调用 Native API 的。

图片描述

所以问题出在,wx.request 对于响应体的数据处理,到底是在 JS Engine 处理的,还是 Native 处理的,在微信不公开小程序源码的情况下,不得而知。

wx.request 的处理对于我们来说,相当于黑盒,并且对于 res.data 的数据类型可能值是多种的,如果想在业务上提供更好的健壮性,还需要兼容 res.dataObject/String 类型时的判断和容错代码。

参考

微信小程序运行流程看这篇就够了


1 篇内容引用

Peace of mind, Code of enjoy

3.5k 声望
1.1k 粉丝
0 条评论
推荐阅读
ServiceWorker 缓存与 HTTP 缓存
虽然 ServiceWorker 和 PWA 正在成为现代 Web 应用程序的标准,但浏览器资源缓存变得比以往任何时候都复杂。 本文涵盖了浏览器缓存的重点内容,具体包括:

JerryC2阅读 1.6k

微信小程序开发--个性化头像生成(国庆渐变头像、圣诞帽头像)
今年国庆 渐变头像着实火了一把,看到微信里面的好友,很多都换上了新颜。 如上图所示,一个渐变的头像。作为码农,看到上面的效果,首先会想到这个是怎么实现的?我可不可以?于是就有了今天这篇文章,记录一下...

caiandroidDev阅读 1.9k

微信小程序-获取用户头像信息以及修改用户头像
这里主要用到button的open-type功能,官网已有说明:给button设置open-type="chooseAvatar",来使bindchooseavatar方法生效,在bindchooseavatar指定的函数中获取用户的头像信息

兔子先森阅读 549

微信小程序数字转中文wxs
场景: 传入数字,转换成天数,比如:index = 1 转换后则为 一,在页面中的应用就是<view>第{{index}}天</view>,转为第几天。

兔子先森阅读 466

创建好的小程序如何正式发布?
前置准备:一个待发布的小程序。具体步骤:Editor 中点击 Publish创建新的试用小程序已有试用小程序轮转绑定进入 User CMS 完成认证个人认证企业认证完善小程序信息提交审核发布上线Editor 中点击 Publish创建新的...

Towify阅读 448

封面图
微信小程序分类菜单激活状态跟随列表滚动自动切换
这里主要用到微信小程序提供的SelectorQuery获取页面节点信息实现,组件用的是微信小程序的scroll-view逻辑就是获取右侧盒子的节点信息,获取右侧子分类的节点信息,当子分类滑动到顶部的之后,则切换左侧分类状...

兔子先森阅读 428

微信小程序项目中使用icon图标
效果:步骤:1、先让ui负责人把你的账号加入到项目中,加入到项目中后就可以在icon图标库中看到该项目2、在小程序中使用新建一个view,在上面加一个class,复制icon名字上去即可,注意格式,格式为iconfont icon名。

兔子先森阅读 424

Peace of mind, Code of enjoy

3.5k 声望
1.1k 粉丝
宣传栏