JSON有两种结构:python
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中的字符串须要用双引号包起来。字符串