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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

标签:
  • 热门焦点
  • Mate60手机壳曝光 致敬自己的经典设计

    8月3日消息,今天下午博主数码闲聊站带来了华为Mate60的第三方手机壳图,可以让我们在真机发布之前看看这款华为全新旗舰的大致轮廓。从曝光的图片看,Mate 60背后摄像头面积依然
  • 俄罗斯:将审查iPhone等外国公司设备 保数据安全

    iPhone和特斯拉都属于在各自领域领头羊的品牌,推出的产品也也都是数一数二的,但对于一些国家而言,它们的产品可靠性和安全性还是在限制范围内。近日,俄罗斯联邦通信、信息技术
  • 7月安卓手机性能榜:红魔8S Pro再夺榜首

    7月份的手机市场风平浪静,除了红魔和努比亚带来了两款搭载骁龙8Gen2领先版处理器的新机之外,别的也想不到有什么新品了,这也正常,通常6月7月都是手机厂商修整的时间,进入8月份之
  • 6月安卓手机好评榜:魅族20 Pro蝉联冠军

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年6月1日至6月30日,仅限国内市场。第一名:魅族20 Pro好评率:95%5月份的时候魅族20 Pro就是
  • 6月安卓手机性能榜:vivo/iQOO霸占旗舰排行榜前三

    2023年上半年已经正式过去了,我们也迎来了安兔兔V10版本,在新的骁龙8Gen3和天玑9300发布之前,性能榜的榜单大体会以骁龙8Gen2和天玑9200+为主,至于那颗3.36GHz的骁龙8Gen2领先
  • 企业采用CRM系统的11个好处

    客户关系管理(CRM)软件可以为企业提供很多的好处,从客户保留到提高生产力。  CRM软件用于企业收集客户互动,以改善客户体验和满意度。  CRM软件市场规模如今超过580
  • 十个简单但很有用的Python装饰器

    装饰器(Decorators)是Python中一种强大而灵活的功能,用于修改或增强函数或类的行为。装饰器本质上是一个函数,它接受另一个函数或类作为参数,并返回一个新的函数或类。它们通常用
  • 重估百度丨“晚熟”的百度云,能等到春天吗?

    ©自象限原创作者|程心排版|王喻可2016年7月13日,百度云计算战略发布会在北京举行,宣告着百度智能云的正式启程。彼时的会场座无虚席,甚至排队排到了门外,在场的所有人几乎都
  • iQOO Neo8 Pro即将开售:到手价3099元起 安卓性能最强旗舰

    5月23日,iQOO如期举行了新品发布会,全新的iQOO Neo8系列也正式与大家见面,包含iQOO Neo8和iQOO Neo8 Pro两个版本,其中标准版搭载高通骁龙8+,而Pro版更
Top