今天碰到一个小bug,debug却花了两个多小时。
原因是服务端拿过来的json里面,有一个字符串是直接从sql取的,里面有个回车没有转义成标准json格式的\n,而是一个特殊字符(\u2028)。这个测试字符串用了半年,app端甚至小程序开发者工具都没报错,可以正常解析成回车,但是iOS端导致脚本停止执行,页面元素丢失,只剩两条错误信息:
看到日志就蒙了,因为请求日志没打出来,而且只有iOS端有这种问题(安卓没试过),地毯式排查了很长时间才发现是这个接口问题,本来以为是代码里引入了特殊字符,根本没想到是请求json格式问题……
这个json本身格式也不规范,但是大多数平台都能成功解析,所以也希望小程序这边也能正常解析;如果觉得对json格式要求严格一些比较好,也希望这个错误能有友好一点的提示。
## 复现
为了方便交流,临时开了一个测试接口,小程序iOS端调用即可复现:
wx.request({ url: 'https://myseu.cn/test/wxapp-bug-test' , success: console.log }) |
后端代码很简单:
class WxappBugHandler(BaseHandler): def get( self ): self .write({ 'test' : '\u2028' }) |
我说的很明确了,这确实(似乎)不符合json规范,但是其他几乎所有平台解析都没有问题。
这就是空值如何复现?而且字符串表达式中是不允许换行的