python將字符串轉(zhuǎn)換成json的方法小結(jié)
最近在工作中遇到了一個(gè)小問題,如果要將字符串型的數(shù)據(jù)轉(zhuǎn)換成dict類型,我第一時(shí)間就想到了使用json函數(shù)。但是里面出現(xiàn)了一些問題
1、通過json來轉(zhuǎn)換:
In [1]: import json In [2]: mes = '{"InsId": 2, "name": "lege-happy", "CreationTime": "2019-04-23T03:18:02Z"}' In [3]: mes_to_dict = json.loads(mes) In [4]: print type(mes_to_dict) <type 'dict'>
以上的方式轉(zhuǎn)換是沒問題的,但是加入mes的格式為mes = '{"InsId": 2, "name": "lege-happy", "CreationTime": "2019-04-23T03:18:02Z"}'
的時(shí)候使用json來轉(zhuǎn)換的時(shí)候又會(huì)發(fā)生什么呢?
In [5]: import json In [6]: mes = "{'InsId': 1, 'name': 'lege-error', 'CreationTime': '2019-04-24T03:18:02Z'}" In [7]: mes_to_dict = json.loads(mes) --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-7-77264851f35b> in <module>() ----> 1 mes_to_dict = json.loads(mes) /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.pyc in loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw) 336 parse_int is None and parse_float is None and 337 parse_constant is None and object_pairs_hook is None and not kw): --> 338 return _default_decoder.decode(s) 339 if cls is None: 340 cls = JSONDecoder /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.pyc in decode(self, s, _w) 364 365 """ --> 366 obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 367 end = _w(s, end).end() 368 if end != len(s): /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.pyc in raw_decode(self, s, idx) 380 """ 381 try: --> 382 obj, end = self.scan_once(s, idx) 383 except StopIteration: 384 raise ValueError("No JSON object could be decoded") ValueError: Expecting property name: line 1 column 2 (char 1)
所以使用 json 進(jìn)行轉(zhuǎn)換存在一個(gè)潛在的限制:
由于 json 語法規(guī)定 數(shù)組或?qū)ο笾械淖址仨毷褂秒p引號(hào),不能使用單引號(hào) (官網(wǎng)上有一段描述是 “A string is a sequence of zero or more Unicode characters, wrapped in double quotes, using backslash escapes” ),因此上面的轉(zhuǎn)換是錯(cuò)誤的:
通過eval來轉(zhuǎn)換:
In [8]: mes = '{"InsId": 2, "name": "lege-happy", "CreationTime": "2019-04-23T03:18:02Z"}' In [9]: mes_dict = eval(mes) In [10]: print type(mes_dict) <type 'dict'> In [11]: In [11]: mes = mes = "{'InsId': 1, 'name': 'lege-error', 'CreationTime': '2019-04-24T03:18:02Z'}" In [12]: mes_dict = eval(mes) In [13]: print type(mes_dict) <type 'dict'>
上面的例子可以看出進(jìn)行轉(zhuǎn)換的時(shí)候不存在使用json轉(zhuǎn)換的問題,但是我們需要注意的是使用eval會(huì)存在安全問題,比如:
串型的輸入直接計(jì)算。比如,她會(huì)將'1+1'的計(jì)算串直接計(jì)算出結(jié)果。
In [14]: value = eval(raw_input('please input a value string:')) please input a value string:2 + 2 In [15]: value Out[15]: 4
從上面來看,eval功能可謂非常強(qiáng)大,即可以做string與list,tuple,dict之間的類型轉(zhuǎn)換,還可以做計(jì)算器使用!更有甚者,可以對她能解析的字符串都做處理,而不顧忌可能帶來的后果!所以說eval強(qiáng)大的背后,是巨大的安全隱患?。。?/p>
比如說用戶惡意輸入下面的字符串:
open(r'D://filename.txt', 'r').read() __import__('os').system('dir') __import__('os').system('rm -rf /etc/*')
那么eval就會(huì)顯示你電腦目錄結(jié)構(gòu),讀取文件,刪除文件等等。如果是格盤等更嚴(yán)重的操作,她也會(huì)照做不誤?。?! 顯然這個(gè)不符合我們的需求!
通過literal_eval轉(zhuǎn)換:
In [20]: import ast In [21]: mes = '{"InsId": 2, "name": "lege-happy", "CreationTime": "2019-04-23T03:18:02Z"}' In [22]: mes_dict = ast.literal_eval(mes) In [23]: print type(mes_dict) <type 'dict'> In [24]: In [24]: In [24]: mes = mes = "{'InsId': 1, 'name': 'lege-error', 'CreationTime': '2019-04-24T03:18:02Z'}" In [25]: mes_dict = ast.literal_eval(mes) In [26]: print type(mes_dict) <type 'dict'>
使用 ast.literal_eval 進(jìn)行轉(zhuǎn)換既不存在使用 json 進(jìn)行轉(zhuǎn)換的問題,也不存在使用 eval 進(jìn)行轉(zhuǎn)換的 安全性問題,因此推薦使用 ast.literal_eval。
我們來看看官方文檔怎么描述literal_eval的:
def literal_eval(node_or_string): """ Safely evaluate an expression node or a string containing a Python expression. The string or node provided may only consist of the following Python literal structures: strings, numbers, tuples, lists, dicts, booleans, and None. """
意思說ast模塊就是幫助Python應(yīng)用來處理抽象的語法解析的。而該模塊下的literal_eval()函數(shù):則會(huì)判斷需要計(jì)算的內(nèi)容計(jì)算后是不是合法的python類型,如果是則進(jìn)行運(yùn)算,否則就不進(jìn)行運(yùn)算。
比如說上面的計(jì)算操作,及危險(xiǎn)操作,如果換成了ast.literal_eval(),
都會(huì)拒絕執(zhí)行。
所以個(gè)人推薦大家轉(zhuǎn)換dict的時(shí)候,出于安全考慮對字符串進(jìn)行類型轉(zhuǎn)換的時(shí)候,最好使用ast.literal_eval()
函數(shù)!
總結(jié)
以上所述是小編給大家介紹的python將字符串轉(zhuǎn)換成json的方法小結(jié) ,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
- Python xml、字典、json、類四種數(shù)據(jù)類型如何實(shí)現(xiàn)互相轉(zhuǎn)換
- 使用Python解析JSON數(shù)據(jù)的基本方法
- python中報(bào)錯(cuò)"json.decoder.JSONDecodeError: Expecting value:"的解決
- Python操作json數(shù)據(jù)的一個(gè)簡單例子
- Python解析json時(shí)提示“string indices must be integers”問題解決方法
- Python解析json之ValueError: Expecting property name enclosed in double quotes: line 1 column 2(char 1)
- Python中字典和JSON互轉(zhuǎn)操作實(shí)例
- Python中json.dumps()函數(shù)的使用解析
- Python Json模塊中dumps、loads、dump、load函數(shù)介紹
- python中將字典轉(zhuǎn)換成其json字符串
- Python中數(shù)據(jù)類轉(zhuǎn)換為JSON的方法詳解
相關(guān)文章
softmax及python實(shí)現(xiàn)過程解析
這篇文章主要介紹了softmax及python實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09python實(shí)現(xiàn)系統(tǒng)狀態(tài)監(jiān)測和故障轉(zhuǎn)移實(shí)例方法
這篇文章主要介紹了用python實(shí)現(xiàn)系統(tǒng)狀態(tài)監(jiān)測和故障轉(zhuǎn)移的代碼方法2013-11-11Python3 獲取一大段文本之間兩個(gè)關(guān)鍵字之間的內(nèi)容方法
今天小編就為大家分享一篇Python3 獲取一大段文本之間兩個(gè)關(guān)鍵字之間的內(nèi)容方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10python密碼學(xué)RSA算法及秘鑰創(chuàng)建教程
這篇文章主要為大家介紹了python密碼學(xué)RSA算法及秘鑰創(chuàng)建教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05python不到50行代碼完成了多張excel合并的實(shí)現(xiàn)示例
這篇文章主要介紹了python不到50行代碼完成了多張excel合并的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05python的pyecharts繪制各種圖表詳細(xì)(附代碼)
這篇文章主要介紹了python的pyecharts繪制各種圖表詳細(xì)(附代碼),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11Python基于FTP模塊實(shí)現(xiàn)ftp文件上傳操作示例
這篇文章主要介紹了Python基于FTP模塊實(shí)現(xiàn)ftp文件上傳操作,結(jié)合實(shí)例形式分析了Python引入ftp模塊及相關(guān)設(shè)置、文件傳輸?shù)炔僮骷记?需要的朋友可以參考下2018-04-04