程宇寒 2019-09-20 12:09 采纳率: 100%
浏览 7533
已采纳

javascript中JSON.parse()函数处理json中的\斜杠转义字符报错

javascript中JSON.parse()函数处理json中的\斜杠转义字符报错
这是原贴

直接po图和代码

图片说明

图片说明

图片说明

疑惑

大家说一下为什么json字符串中包含2个\斜杠和3个\斜杠的情况,JSON.parse()函数在解析时会报错?
而为什么json字符串中包含1个\斜杠和4个\斜杠的情况,JSON.parse()函数却可以正确解析?
谁能帮忙解答一下吗?不吝赐教!

这是我的原贴,原贴排版更清晰,大家可以给我留言,帮我把这个问题解释清楚即可,这个问题挺困扰我的!

//---------------------------
/*
大家可以试一下写1个\斜杠,或者写2个\斜杠,或者写3个\斜杠,或者写,4个\斜杠,再分
别使用JSON.parse()函数解析一下,效果有很大的不同,有的会报错,有的能正确解析
*/
var jsonStr27 = '{"sex":"男","info":"我\\是超人"}'; // 2个\斜杠
var jsonObj75 = eval("(" + jsonStr27 + ")"); //正确
console.log(jsonObj75.sex, jsonObj75.info);//结果为男 我是超人

// var jsonObj76 = JSON.parse(jsonStr27);//报错
// console.log(jsonObj76.sex, jsonObj76.info);

var jsonStr68 = '{"sex":"男","info":"我\是超人"}';// 1个\斜杠
var jsonObj90 = eval("(" + jsonStr68 + ")");//正确
var jsonObj77 = JSON.parse(jsonStr68);//正确
console.log(jsonObj77.sex, jsonObj77.info);//结果为男 我是超人

var jsonStr69 = '{"sex":"男","info":"我\\\是超人"}';// 3个\斜杠
var jsonObj91 = eval("(" + jsonStr69 + ")");//正确
// var jsonObj78 = JSON.parse(jsonStr69);//报错
// console.log(jsonObj78.sex, jsonObj78.info);

var jsonStr70 = '{"sex":"男","info":"我\\\\是超人"}';// 4个\斜杠
var jsonObj92 = eval("(" + jsonStr70 + ")");//正确
var jsonObj79 = JSON.parse(jsonStr70);//正确
console.log(jsonObj79.sex, jsonObj79.info);//结果为男 我\是超人


//---------------------------------
var jsonStr28 = {"sex":"男","info":"我\\是咸蛋超人"};
console.log(jsonStr28.sex, jsonStr28.info);//结果为男 我\是咸蛋超人

var jsonStr29 = {"sex":"男","info":"我\是孙悟空"};
console.log(jsonStr29.sex, jsonStr29.info);//结果为男 我是孙悟空

var jsonStr30 = {"sex":"男","info":"我\\\是康熙"};
console.log(jsonStr30.sex, jsonStr30.info);//结果为男 我\是康熙

var jsonStr31 = {"sex":"男","info":"我\\\\是小宝"};
console.log(jsonStr31.sex, jsonStr31.info);//结果为男 我\\是小宝
  • 写回答

1条回答 默认 最新

  • Alan_Wdd 2019-09-20 16:06
    关注

    一般来说在JSON.parse的参数包含转移字符的时候会遇到两次转义的问题,其实第一次是字符串本身的转义,第二次是将真正转为js对象的转义。
    比如:将字符串'{"a":"b","b":"\\"}'传递给JSON.parse,首先解析器提取单引号括起来的字符串时认为第一个\转义第二个\ 第三个\转义第四个\,也就是说实际可输出字符串是{"a":"b","b":"\"}(可通过console.log('{"a":"b","b":"\\"}')验证),之后正式转为js对象的时候还有一次转义,也就是实际输出字符转中的第一个\转义第二个\(此时只有两个\)。所以console.log(JSON.parse('{"a":"b","b":"\\"}') );输出结果为Object {a: "b", b: "\"},也就是说实际显示的数据为一个\(实际可输出一个\说明在此之前还有一个\)。
    如果想在js对象中出现一个\,需要在json字符串中出现四个\

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 3月21日

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题