日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁(yè) > 科技  > 軟件

一日一技:為什么這個(gè)JSON無(wú)法解析?

來(lái)源: 責(zé)編: 時(shí)間:2024-05-24 17:24:53 200觀看
導(dǎo)讀我們知道,Python里面,json.dumps是序列化操作,json.loads是反序列化操作。當(dāng)我使用json.dumps把一個(gè)字典轉(zhuǎn)換為字符串以后,也可以使用json.loads把這個(gè)字符串轉(zhuǎn)換為字典。那么,有沒(méi)有可能出現(xiàn)這樣的情況:某個(gè)字典,使用json.d

我們知道,Python里面,json.dumps是序列化操作,json.loads是反序列化操作。當(dāng)我使用json.dumps把一個(gè)字典轉(zhuǎn)換為字符串以后,也可以使用json.loads把這個(gè)字符串轉(zhuǎn)換為字典。BVQ28資訊網(wǎng)——每日最新資訊28at.com

那么,有沒(méi)有可能出現(xiàn)這樣的情況:某個(gè)字典,使用json.dumps轉(zhuǎn)換成了字符串s。但是當(dāng)我使用json.loads(s)時(shí),卻會(huì)報(bào)錯(cuò)?BVQ28資訊網(wǎng)——每日最新資訊28at.com

你別不信,我們來(lái)做一個(gè)實(shí)驗(yàn)。執(zhí)行下面這段代碼,打印出一段JSON字符串:BVQ28資訊網(wǎng)——每日最新資訊28at.com

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

運(yùn)行效果如下圖所示:BVQ28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BVQ28資訊網(wǎng)——每日最新資訊28at.com

接下來(lái),你把下面這個(gè)字符串復(fù)制到Python里面并使用json.loads解析:BVQ28資訊網(wǎng)——每日最新資訊28at.com

{"title": "關(guān)于abc", "raw": "## 摘要/n這篇文章主要包含xx和yy/n/n## 詳情/n1. abc/n2. def/n"}

運(yùn)行效果如下圖所示:BVQ28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BVQ28資訊網(wǎng)——每日最新資訊28at.com

但如果你不是復(fù)制JSON字符串后賦值,而是直接把output反序列化,它又是正常的,如下圖所示:BVQ28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BVQ28資訊網(wǎng)——每日最新資訊28at.com

你以為這就很奇怪了?更奇怪的事情還在后面。現(xiàn)在把這段有問(wèn)題的JSON復(fù)制到一個(gè)文件里面,使用Python來(lái)讀取這個(gè)文本,如下圖所示:BVQ28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BVQ28資訊網(wǎng)——每日最新資訊28at.com

為什么現(xiàn)在又正常了?BVQ28資訊網(wǎng)——每日最新資訊28at.com

如果你看過(guò)這篇文章:# 一日一技:怎么你的字符串跟我不一樣,那么你可以試一試使用repr來(lái)檢查一下他們有什么不同。在Jupyter里面,可以通過(guò)直接輸入變量名的方式來(lái)檢查。大家注意下圖兩個(gè)字符串的區(qū)別:BVQ28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BVQ28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)我從文件里面讀取JSON字符串時(shí),字符串中的/n變成了//n,所以解析正常。但是當(dāng)我直接把字符串賦值給變量時(shí),換行符是/n,于是解析失敗。BVQ28資訊網(wǎng)——每日最新資訊28at.com

真正的關(guān)鍵,就是這個(gè)反斜杠。從文本文件里面讀取的時(shí)候,所有反斜杠都是普通的字符串。讀取文件以后使用repr查看,換行符就會(huì)變成//n。但直接使用變量賦值的時(shí)候,/n就會(huì)變成真正的換行符號(hào),這里的/是轉(zhuǎn)義字符,不是普通字符串。BVQ28資訊網(wǎng)——每日最新資訊28at.com

如果變量賦值時(shí),手動(dòng)使用雙反斜杠,或者在字符串前面加個(gè)r,讓反斜杠變成普通字符,那么這個(gè)JSON字符串又可以正常解析了。如下圖所示:BVQ28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BVQ28資訊網(wǎng)——每日最新資訊28at.com

不僅是/n,任何一個(gè)JSON字符串里面包含了反斜杠,都會(huì)有這個(gè)問(wèn)題。如下圖所示:BVQ28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BVQ28資訊網(wǎng)——每日最新資訊28at.com

還是使用repr就能發(fā)現(xiàn)他們的差異:BVQ28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BVQ28資訊網(wǎng)——每日最新資訊28at.com

所以,這個(gè)問(wèn)題的本質(zhì)原因,就在于當(dāng)我們使用print()函數(shù)打印一個(gè)字符串時(shí),打印出來(lái)的樣子跟這個(gè)字符串實(shí)際的樣子并不一樣。所以當(dāng)我們鼠標(biāo)選中這個(gè)打印出來(lái)的字符串并hardcode寫(xiě)到代碼里面,變量賦值時(shí),這個(gè)字符串已經(jīng)不是原來(lái)的字符串了。所以當(dāng)有反斜杠時(shí),就會(huì)出現(xiàn)報(bào)錯(cuò)的情況。BVQ28資訊網(wǎng)——每日最新資訊28at.com

我知道有不少同學(xué)寫(xiě)代碼時(shí)喜歡使用print大法來(lái)調(diào)試,那么一定要小心這個(gè)問(wèn)題。當(dāng)你定義一個(gè)字符串變量時(shí),如果有字符串需要直接寫(xiě)死到代碼里面,那么你需要注意反斜杠的問(wèn)題。當(dāng)字符串有反斜杠時(shí),要不你就在定義的前面加上r。寫(xiě)成變量 = r'hardcode的字符串',要不你就把字符串先寫(xiě)到文件里面,然后用Python來(lái)讀文件,獲得這個(gè)字符串,從而規(guī)避掉反斜杠的問(wèn)題。BVQ28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-90666-0.html一日一技:為什么這個(gè)JSON無(wú)法解析?

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: Python 中 20 個(gè)提高代碼質(zhì)量的測(cè)試工具

下一篇: Try-Catch的性能問(wèn)題及其優(yōu)化策略

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 主站蜘蛛池模板: 乌拉特中旗| 梧州市| 南雄市| 桦川县| 浦县| 白银市| 仲巴县| 遂平县| 灌南县| 通海县| 广德县| 潮州市| 石景山区| 祁东县| 广元市| 东港市| 齐齐哈尔市| 资阳市| 巴青县| 玛纳斯县| 锡林郭勒盟| 突泉县| 颍上县| 九江县| 大姚县| 巩义市| 合川市| 宣恩县| 颍上县| 清徐县| 谢通门县| 浙江省| 宜兰市| 全州县| 蛟河市| 宝鸡市| 化隆| 孟津县| 石泉县| 芮城县| 东兰县|