收藏
回答

JSON.parse解析带有特殊字符的字符串报错?

如果json字符串中有特殊字符,导致解析失败,已遇到过不下十次,希望微信能解决这个问题。

回答关注问题邀请回答
收藏

3 个回答

  • 风动之石
    风动之石
    07-30

    我也遇到了类似问题。只在 iOS 系统上。

    如果是接口返回的 JSON 字符串里包含行分隔符(码位为\u2028)时,wx.request 的 success 的 res 参数的 res.data 将变成字符串类型,且行分隔符会被替换为换行符(码位为\u000A)。

    wx.request({
        url: 'http://windstone.cc/api',
        success(res) {
            console.log('typeof res', typeof res); // object
            console.log('typeof res.data', typeof res.data); // string
            let data = res.data;
            for (let i = 0; i < data.length; i++) {
                console.log(data[i], data[i].codePointAt(0).toString(16)); // 此处将字符串的每个码位打印出来,发现原本行分隔符所在的位置的码位为 \u000A,即变成了换行符
            }
        }
    })
    


    假设 http://windstone.cc/api 返回如下 JSON 字符串(可通过 Charles 做 Map Local),description 里值是一个未经编码的行分隔符(码位为\u2028),

    {
        "result": 1,
        "description": "�"
    }
    


    解决方案是,将 res.data 里的换行符替换成 \\n,再经过 JSON.parse() 解析成 JavaScript 对象即可。

    wx.request({
        url: 'http://windstone.cc/api',
        success(res) {
            console.log('typeof res', typeof res); // object
            console.log('typeof res.data', typeof res.data); // string
            let data = res.data;
            data = data.replace(/\n/g, '\\n'); // 此处将换行符替换成 \\n
            data = JSON.parse(data) // 可以成功解析
        }
    })
    


    以上测试是在 iPhone XS MAX 上进行,微信版本 7.0.14,系统版本:iOS 13.5.1

    07-30
    有用
    回复
  • 沉冰
    沉冰
    06-23

    给个代码片段看看

    https://developers.weixin.qq.com/miniprogram/dev/devtools/minicode.html

    06-23
    有用
    回复 3
  • AL苏长利
    AL苏长利
    06-22

    是因为有特殊字符,JSON的解析库应该是比较老导致的,希望官方升级一下

    06-22
    有用
    回复
登录 后发表内容
问题标签