JSON有两种结构:
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)。
>>> x="[null,true,false,1]"
>>> json.loads(x)
[None, True, False, 1]
>>> eval(x)
Traceback (most recent call last):
File "", line 1, in
File "", line 1, in
NameError: name 'null' is not defined
在遇到特殊类型的时候,eval就不管用了。eval通常用来执行一个字符串表达式,并返回表达式的值。比如:
>>> eval('1+1')
2
>>> json.loads('1+1')
Traceback (most recent call last):
File "", line 1, in
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)
eval与linux shell中的反引号(`)的作用差不多,如:
[root@zxh ~]# x=`expr 1 + 1`
[root@zxh ~]# echo $x
2
附:
json字符串转python对象的数据类型转换表
python对象转json字符串类型转换表
>>> dct = {'one':None,'two':2}
>>> json.dumps(dct)
'{"two": 2, "one": null}'
>>> arry = [True, False, 'hello']
>>> json.dumps(arry)
'[true, false, "hello"]'
另,需要注意的是:
>>> dct="{'one':1}"
>>> json.loads(dct)
Traceback (most recent call last):
File "", line 1, in
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中的字符串需要用双引号包起来。