每日一技能:为什么你总是对反斜杠感到困惑?大的。首先,我们编写一个非常简单的Python代码。它的作用是先将一个字段转换成JSON格式的字符串,再将字符串转换成JSON格式的字符串:importjsoninfo={'name':'kingname','address':'Hangzhou','salary':99999}info_json=json.dumps(info)#第一次转换后打印出来print(info_json)info_json_json=json.dumps(info_json)#第二次转换后打印出来print(info_json_json)其运行效果为如下图所示。字典第一次被转换成JSON格式的字符串。只有中文杭州变成了Unicode编码\u676d\u5dde,其他地方没有反斜线。在Python中,反斜杠不能单独出现。在这里,\u676d\u5dde中的两个反斜杠实际上应该是\u。表示这两种编码都是Unicode编码。接下来将第一次生成的JSON字符串:{"name":"kingname","address":"\u676d\u5dde","salary":99999}再次转换成JSON格式的字符串,这一次改为:"{\"name\":\"kingname\",\"address\":\"\\u676d\\u5dde\",\"salary\":99999}"为什么突然出现这样的多个反斜杠?这是因为JSON格式的字符串本身使用双引号来表示字符串。如果原始字符串本身有双引号,就会造成混淆。这时候Python需要把原来字符串的双引号变成普通字符,失去双引号的作用。所以用\"把双引号变成普通字符。这相当于在Python中,你可以像这样定义一个包含双引号的字符串:>>>a="Tellme:\"Hello\"">>>print(a)Tellme:"Hello"这里,双引号hello周围的引号被反斜杠,使它们成为普通字符,防止它们提前与最外面的双引号配对。如果不加反斜杠,字符串里面的双引号会提前和外面的双引号配对,造成语法错误:>>>b="Tellme:"Hello""File"",line1b="Tellme:"Hello""^SyntaxError:invalidsyntax在这里,"Tellme:"变成了字符串,最后的""变成了空字符串。那么中间的hello就变成了一个undefined变量。在Python中,没有将可变字符串写成undefinedstrings的方式,所以会报语法错误。JSON格式的字符串本质上也是字符串,自然要遵循这样的规则。因此,在字符串中原始双引号的左侧添加了反斜杠。那么,为什么原来的\u676d\u5dde变成了\\u676d\\u5dde呢?这是因为,在第二次执行json.dumps时,传入的参数是一个JSON格式的字符串,本质上就是一个字符串。而如果字符串中有反斜杠,那么在JSON再次转换时,需要以普通字符串的形式标明这是一个反斜杠,而不是有特殊含义的反斜杠,所以用\\表示普通反斜杠。好吧,那么你可以猜到如果你再次将info_json_json添加到json.dumps会发生什么?它将变成:"\"{\\\"name\\\":\\\"kingname\\\",\\\"address\\\":\\\"\\\\u676d\\\\u5dde\\\",\\\"salary\\\":99999}\""为什么有三个反斜杠和四个反斜杠?其实很简单。当你对info_json_json执行json.dumps时,Python是如何转换的?我们看看:"{\"name\":\"kingname\",\"address\":\"\\u676d\\u5dde\",\"salary\":99999}"对字符串进行json.dumps时,记住一个关键方法——从左到右,一个字符一个字符的转换。1.第一个字符是双引号,所以变成\"2.第二个字符是{,不是特殊符号,保留3.第三个字符是\,变成\\4.第四个字符是",变成\"5....全部执行完毕。由于本次转换是将一个字符串转成JSON格式的字符串,所以在最外面加了双引号。所以我们得到:"\"{\\\"名称\\\":\\\"王名\\\",\\\"地址\\\":\\\"\\\\u676d\\\\u5dde\\\",\\\"salary\\\":99999}\""在爬虫开发过程中,我们可能会遇到以上字符串经过多次JSON转换后,这时候千万不要轻易使用字符串.replace方法将多个反斜杠替换为空或者两个反斜杠和一个反斜杠。这样做只会让你的数据更难解析。正确的做法应该是对数据逐层尝试使用json.loads,逐层恢复,恢复到原来的状态{'name':'kingname','address':'Hangzhou','salary':99999}这种简单的形式。好了,今天的介绍就到这里,还有最后一个思考问题:还是上面的代码,现在打开PyCharm的调试模式,然后统计info_json和info_json_json中反斜杠的个数,如下图:WhyIninfo_json,出现了\\u676d\\u5dde,为什么info_json_json中双引号前有两个反斜杠,而\"\\u676d\\u5dde\"变成了\\"\\\\u676d\\\\u5dde。这篇文章转载自微信公众号“闻所未闻的密码”,可通过以下二维码关注,转载请联系密码公众号。