eval与json.loads对json的处理小记

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

eval与linux shell中的反引号(`)的作用差不多,如:

[root@zxh ~]# x=`expr 1 + 1`

[root@zxh ~]# echo $x

2


附:

  • 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':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 "<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中的字符串需要用双引号包起来

猜你喜欢

转载自blog.csdn.net/Scrat_Kong/article/details/82501450