JSON并不完全是JavaScript的子集,它们对部分字符处理不同。

业务方提出的BUG,某位用户总是无法正常使用系统,初步诊断为接口JSON解析失败。

进一步检查发现,该接口返回数据:
正常情况下,“Response Headers”中“Content-Type”为“application/json; charset=utf-8
”,Chrome开发工具中“Response Body Preview”为JSON对象。
异常情况下,“Response Headers”中“Content-Type”为“application/json; charset=utf-8
”,Chrome开发工具中“Response Body Preview”为JSON字符串。

而“Response Body”初看起来,一切正常。仔细一看才发现,原来其中混入了一个控制字符“ESC”(Unicode编码为\u001b),现代浏览器(IE9-11、Chrome、Firefox)不可正常识别数据格式(IE8反而可以识别),造成JSON解析失败,进而触发Ajax的error回调。如图所示:
JSON特殊字符

查询相关资料,发现之前对于JSON的理解有些狭隘,原来JSON并不完全是JavaScript的子集。
mozilla说明:
JavaScript 与 JSON 的区别

现代浏览器测试:

由此可知,需要对用户输入进行过滤。对于部分字符进行预处理,避免浏览器无法解析接口返回数据。
写了一个处理函数:

参考资料:
介绍 JSON
http://www.json.org/json-zh.html
JSON
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/JSON
JSON: The JavaScript subset that isn’t
http://www.timelessrepo.com/json-isnt-a-javascript-subset

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注