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对象,但也有区别:

  1. >>> import json  
  2. >>> s = '{"one":1,"two":2}'  
  3. >>> json.loads(s)  
  4. {u'two'2, u'one'1}  
  5. >>> eval(s)  
  6. {'two'2'one'1}  
json.loads与eval都能将s转成python中的对象,json.loads将json中的字符串转成unicode(types.UnicodeType),eval转成了str(types.StringType)。

对于普通的数据类型,json.loads和eval都能用,但:

  1. >>> x="[null,true,false,1]"  
  2. >>> json.loads(x)  
  3. [NoneTrueFalse1]  
  4. >>> eval(x)  
  5. Traceback (most recent call last):  
  6.   File "<stdin>", line 1in <module>  
  7.   File "<string>", line 1in <module>  
  8. NameError: name 'null' is not defined  
在遇到特殊类型的时候,eval就不管用了。eval通常用来执行一个字符串表达式,并返回表达式的值。比如:
  1. >>> eval('1+1')  
  2. 2  
  3. >>> json.loads('1+1')  
  4. Traceback (most recent call last):  
  5.   File "<stdin>", line 1in <module>  
  6.   File "/usr/lib/python2.7/json/__init__.py", line 338in loads  
  7.     return _default_decoder.decode(s)  
  8.   File "/usr/lib/python2.7/json/decoder.py", line 368in decode  
  9.     raise ValueError(errmsg("Extra data", s, end, len(s)))  
  10. ValueError: Extra data: line 1 column 2 - line 1 column 4 (char 1 - 3)  
eval与linux shell中的反引号(`)的作用差不多,如:
  1. [root@zxh ~]# x=`expr 1 + 1`  
  2. [root@zxh ~]# echo $x  
  3. 2  

附:
  • json字符串转python对象的数据类型转换表

JSONPython
objectdict
arraylist
stringunicode
number (int)int, long
number (real)float
trueTrue
falseFalse
nullNone
  • python对象转json字符串类型转换表

PythonJSON
dictobject
list, tuplearray
str, unicodestring
int, long, floatnumber
Truetrue
Falsefalse
Nonenull
  1. >>> dct = {'one':None,'two':2}  
  2. >>> json.dumps(dct)  
  3. '{"two": 2, "one": null}'  
  1. >>> arry = [TrueFalse'hello']  
  2. >>> json.dumps(arry)  
  3. '[true, false, "hello"]'  
另,需要注意的是:
  1. >>> dct="{'one':1}"  
  2. >>> json.loads(dct)  
  3. Traceback (most recent call last):  
  4.   File "<stdin>", line 1in <module>  
  5.   File "/usr/lib/python2.7/json/__init__.py", line 338in loads  
  6.     return _default_decoder.decode(s)  
  7.   File "/usr/lib/python2.7/json/decoder.py", line 365in decode  
  8.     obj, end = self.raw_decode(s, idx=_w(s, 0).end())  
  9.   File "/usr/lib/python2.7/json/decoder.py", line 381in raw_decode  
  10.     obj, end = self.scan_once(s, idx)  
  11. ValueError: Expecting property name: line 1 column 2 (char 1)  
报错是因为json不认单引号,json中的字符串需要用双引号包起来。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值