python中eval与json.loads对json的处理

JSON有两种结构:python

  • “名称/值”对的集合(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对象,但也有区别:json

>>> 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会报错以下:python2.7

这时使用eval不会报错,强烈推荐,这个问题困扰了我一夜。.net

对于普通的数据类型,json.loads和eval都能用,但:code

>>> 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 defined

在遇到特殊类型的时候,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对象的数据类型转换表    python对象转json字符串类型转换表ci

JSON Python
object dict
array list
string unicode
number (int) int, long
number (real) float
true True
false False
null None 

      

Python JSON
dict object
list, tuple array
str, unicode string
int, long, float number
True true
False false
None null
>>> dct = {'one':None,'two':2}  
>>> json.dumps(dct)  
'{"two": 2, "one": null}'
>>> arry = [True, False, 'hello']  
>>> json.dumps(arry)  
'[true, false, "hello"]'

另,须要注意的是:unicode

>>> 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中的字符串须要用双引号包起来。字符串

相关文章
相关标签/搜索