当前位置:首页 > 科技  > 软件

一日一技:为什么这个JSON无法解析?

来源: 责编: 时间:2024-05-24 17:24:53 324观看
导读我们知道,Python里面,json.dumps是序列化操作,json.loads是反序列化操作。当我使用json.dumps把一个字典转换为字符串以后,也可以使用json.loads把这个字符串转换为字典。那么,有没有可能出现这样的情况:某个字典,使用json.d

我们知道,Python里面,json.dumps是序列化操作,json.loads是反序列化操作。当我使用json.dumps把一个字典转换为字符串以后,也可以使用json.loads把这个字符串转换为字典。tiz28资讯网——每日最新资讯28at.com

那么,有没有可能出现这样的情况:某个字典,使用json.dumps转换成了字符串s。但是当我使用json.loads(s)时,却会报错?tiz28资讯网——每日最新资讯28at.com

你别不信,我们来做一个实验。执行下面这段代码,打印出一段JSON字符串:tiz28资讯网——每日最新资讯28at.com

import jsontext = '''## 摘要这篇文章主要包含xx和yy## 详情1. abc2. def'''item = {'title': '关于abc', 'raw': text}output = json.dumps(item, ensure_ascii=False)print(output)

运行效果如下图所示:tiz28资讯网——每日最新资讯28at.com

图片图片tiz28资讯网——每日最新资讯28at.com

接下来,你把下面这个字符串复制到Python里面并使用json.loads解析:tiz28资讯网——每日最新资讯28at.com

{"title": "关于abc", "raw": "## 摘要/n这篇文章主要包含xx和yy/n/n## 详情/n1. abc/n2. def/n"}

运行效果如下图所示:tiz28资讯网——每日最新资讯28at.com

图片图片tiz28资讯网——每日最新资讯28at.com

但如果你不是复制JSON字符串后赋值,而是直接把output反序列化,它又是正常的,如下图所示:tiz28资讯网——每日最新资讯28at.com

图片图片tiz28资讯网——每日最新资讯28at.com

你以为这就很奇怪了?更奇怪的事情还在后面。现在把这段有问题的JSON复制到一个文件里面,使用Python来读取这个文本,如下图所示:tiz28资讯网——每日最新资讯28at.com

图片图片tiz28资讯网——每日最新资讯28at.com

为什么现在又正常了?tiz28资讯网——每日最新资讯28at.com

如果你看过这篇文章:# 一日一技:怎么你的字符串跟我不一样,那么你可以试一试使用repr来检查一下他们有什么不同。在Jupyter里面,可以通过直接输入变量名的方式来检查。大家注意下图两个字符串的区别:tiz28资讯网——每日最新资讯28at.com

图片图片tiz28资讯网——每日最新资讯28at.com

当我从文件里面读取JSON字符串时,字符串中的/n变成了//n,所以解析正常。但是当我直接把字符串赋值给变量时,换行符是/n,于是解析失败。tiz28资讯网——每日最新资讯28at.com

真正的关键,就是这个反斜杠。从文本文件里面读取的时候,所有反斜杠都是普通的字符串。读取文件以后使用repr查看,换行符就会变成//n。但直接使用变量赋值的时候,/n就会变成真正的换行符号,这里的/是转义字符,不是普通字符串。tiz28资讯网——每日最新资讯28at.com

如果变量赋值时,手动使用双反斜杠,或者在字符串前面加个r,让反斜杠变成普通字符,那么这个JSON字符串又可以正常解析了。如下图所示:tiz28资讯网——每日最新资讯28at.com

图片图片tiz28资讯网——每日最新资讯28at.com

不仅是/n,任何一个JSON字符串里面包含了反斜杠,都会有这个问题。如下图所示:tiz28资讯网——每日最新资讯28at.com

图片图片tiz28资讯网——每日最新资讯28at.com

还是使用repr就能发现他们的差异:tiz28资讯网——每日最新资讯28at.com

图片图片tiz28资讯网——每日最新资讯28at.com

所以,这个问题的本质原因,就在于当我们使用print()函数打印一个字符串时,打印出来的样子跟这个字符串实际的样子并不一样。所以当我们鼠标选中这个打印出来的字符串并hardcode写到代码里面,变量赋值时,这个字符串已经不是原来的字符串了。所以当有反斜杠时,就会出现报错的情况。tiz28资讯网——每日最新资讯28at.com

我知道有不少同学写代码时喜欢使用print大法来调试,那么一定要小心这个问题。当你定义一个字符串变量时,如果有字符串需要直接写死到代码里面,那么你需要注意反斜杠的问题。当字符串有反斜杠时,要不你就在定义的前面加上r。写成变量 = r'hardcode的字符串',要不你就把字符串先写到文件里面,然后用Python来读文件,获得这个字符串,从而规避掉反斜杠的问题。tiz28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-90666-0.html一日一技:为什么这个JSON无法解析?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Python 中 20 个提高代码质量的测试工具

下一篇: Try-Catch的性能问题及其优化策略

标签:
  • 热门焦点
  • JavaScript 混淆及反混淆代码工具

    介绍在我们开始学习反混淆之前,我们首先要了解一下代码混淆。如果不了解代码是如何混淆的,我们可能无法成功对代码进行反混淆,尤其是使用自定义混淆器对其进行混淆时。什么是混
  • Python异步IO编程的进程/线程通信实现

    这篇文章再讲3种方式,同时讲4中进程间通信的方式一、 Python 中线程间通信的实现方式共享变量共享变量是多个线程可以共同访问的变量。在Python中,可以使用threading模块中的L
  • 雅柏威士忌多款单品价格大跌,泥煤顶流也不香了?

    来源 | 烈酒商业观察编 | 肖海林今年以来,威士忌市场开始出现了降温迹象,越来越多不断暴涨的网红威士忌也开始悄然回归市场理性。近日,LVMH集团旗下苏格兰威士忌品牌雅柏(Ardbeg
  • 得物宠物生意「狂飙」,发力“它经济”

    作者|花花小萌主近日,得物宣布正式上线宠物鉴别,通过得物App内的“在线鉴别”,可找到鉴别宠物的选项。通过上传自家宠物的部位细节,就能收获拥有专业资质认证的得物鉴
  • 自律,给不了Keep自由!

    来源 | 互联网品牌官作者 | 李大为编排 | 又耳 审核 | 谷晓辉自律能不能给用户自由暂时不好说,但大概率不能给Keep自由。近日,全球最大的在线健身平台Keep正式登陆港交所,努力
  • 阿里瓴羊One推出背后,零售企业迎数字化新解

    作者:刘旷近年来随着数字经济的高速发展,各式各样的SaaS应用服务更是层出不穷,但本质上SaaS大多局限于单一业务流层面,对用户核心关切的增长问题等则没有提供更好的解法。在Saa
  • 消息称小米汽车开始筛选交付中心:需至少120个车位

    IT之家 7 月 7 日消息,日前,有微博简介为“汽车行业从业者、长三角一体化拥护者”的微博用户 @长三角行健者 发文表示,据经销商集团反馈,小米汽车目前
  • 华为Mate 60系列用上可变灵动岛:正式版体验将会更出色

    这段时间以来,关于华为新旗舰的爆料日渐密集。据此前多方爆料,今年华为将开始恢复一年双旗舰战略,除上半年推出的P60系列外,往年下半年的Mate系列也将
  • 与兆芯合作 联想推出全新旗舰版笔记本电脑开天N7系列

    联想与兆芯合作推出全新联想旗舰版笔记本电脑开天 N7系列。这个系列采用兆芯KX-6640MA处理器平台,KX-6640MA 处理器是采用了陆家嘴架构,16nm 工艺,4 核 4 线
Top