本文主要是介绍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 loadsreturn _default_decoder.decode(s)File "/usr/lib/python2.7/json/decoder.py", line 368, in decoderaise 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 $x2
附:
- 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 loadsreturn _default_decoder.decode(s)File "/usr/lib/python2.7/json/decoder.py", line 365, in decodeobj, end = self.raw_decode(s, idx=_w(s, 0).end())File "/usr/lib/python2.7/json/decoder.py", line 381, in raw_decodeobj, end = self.scan_once(s, idx)ValueError: Expecting property name: line 1 column 2 (char 1)
报错是因为json不认单引号,json中的字符串需要用双引号包起来
这篇关于eval与json.loads对json的处理小记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!