【轉】python中json.loads與eval的區別


JSON有兩種結構:

  • “名稱/值”對的集合(A collection of name/value pairs)。不同的語言中,它被理解為對象(object),紀錄(record),結構(struct),字典(dictionary),哈希表(hash table),有鍵列表(keyed list),或者關聯數組 (associative array)。
  • 值的有序列表(An ordered list of values)。在大部分語言中,它被理解為數組(array)。

eval與json.loads都可以將大部分的JSON串轉成python對象,但也有區別:

 

>>> import json  
>>> s = '{"one":1,"two":2}'  
>>> json.loads(s)  
{u'two': 2, u'one': 1}  
>>> eval(s)  
{'two': 2, 'one': 1} 

json.loads與eval都能將s轉成python中的對象,json.loads將json中的字符串轉成unicode(types.UnicodeType),eval轉成了str(types.StringType)。

 

對於普通的數據類型,json.loads和eval都能用,但:

>>> x="[null,true,false,1]"  
>>> json.loads(x)  
[None, True, False, 1]  
>>> eval(x)  
Traceback (most recent call last):  
  File "<stdin>", line 1, in <module>  
  File "<string>", line 1, in <module>  
NameError: name 'null' is not define

在遇到特殊類型的時候,eval就不管用了。eval通常用來執行一個字符串表達式,並返回表達式的值。比如:

>>> eval('1+1')  
2  
>>> json.loads('1+1')  
Traceback (most recent call last):  
  File "<stdin>", line 1, in <module>  
  File "/usr/lib/python2.7/json/__init__.py", line 338, in loads  
    return _default_decoder.decode(s)  
  File "/usr/lib/python2.7/json/decoder.py", line 368, in decode  
    raise ValueError(errmsg("Extra data", s, end, len(s)))  
ValueError: Extra data: line 1 column 2 - line 1 column 4 (char 1 - 3)  

附:

 

    • json字符串轉python對象的數據類型轉換表
JSON Python
object dict
array list
string unicode
number (int) int, long
number (real) float
true True
false False
null None
  • python對象轉json字符串類型轉換表

 

Python JSON
dict object
list, tuple array
str, unicode string
int, long, float number
True true
False false
None null

需要注意的是:

>>> dct="{'one':1}"  
>>> json.loads(dct)  
Traceback (most recent call last):  
  File "<stdin>", line 1, in <module>  
  File "/usr/lib/python2.7/json/__init__.py", line 338, in loads  
    return _default_decoder.decode(s)  
  File "/usr/lib/python2.7/json/decoder.py", line 365, in decode  
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())  
  File "/usr/lib/python2.7/json/decoder.py", line 381, in raw_decode  
    obj, end = self.scan_once(s, idx)  
ValueError: Expecting property name: line 1 column 2 (char 1) 

json不認單引號,json中的字符串需要用雙引號包起來。

 

 

終上所述,json與eval區別有兩點:

1、json.loads與eval都能將s轉成python中的對象,json.loads將json中的字符串轉成unicode(types.UnicodeType),eval轉成了str(types.StringType)。

2、json不認單引號,json中的字符串需要用雙引號包起來


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM