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

时间:2022-02-17 06:40:12

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