python中int和eval的区别_【转】python中json.loads与eval的区别

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

>>> importjson>>> 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"", line 1, in File"", line 1, in NameError: name'null' is not define

在遇到特殊类型的时候,eval就不管用了。eval通常用来执行一个字符串表达式,并返回表达式的值。比如:

>>> eval('1+1')2

>>> json.loads('1+1')

Traceback (most recent call last):

File"", line 1, in File"/usr/lib/python2.7/json/__init__.py", line 338, inloadsreturn_default_decoder.decode(s)

File"/usr/lib/python2.7/json/decoder.py", line 368, indecoderaise ValueError(errmsg("Extra data", s, end, len(s)))

ValueError: Extra data: line1 column 2 - line 1 column 4 (char 1 - 3)

附:

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

JSONPython

object

dict

array

list

string

unicode

number (int)

int, long

number (real)

float

true

True

false

False

null

None

python对象转json字符串类型转换表

PythonJSON

dict

object

list, tuple

array

str, unicode

string

int, long, float

number

True

true

False

false

None

null

需要注意的是:

>>> dct="{'one':1}"

>>>json.loads(dct)

Traceback (most recent call last):

File"", line 1, in File"/usr/lib/python2.7/json/__init__.py", line 338, inloadsreturn_default_decoder.decode(s)

File"/usr/lib/python2.7/json/decoder.py", line 365, indecode

obj, end= self.raw_decode(s, idx=_w(s, 0).end())

File"/usr/lib/python2.7/json/decoder.py", line 381, inraw_decode

obj, end=self.scan_once(s, idx)

ValueError: Expecting property name: line1 column 2 (char 1)

json不认单引号,json中的字符串需要用双引号包起来。

终上所述,json与eval区别有两点:

1、json.loads与eval都能将s转成python中的对象,json.loads将json中的字符串转成unicode(types.UnicodeType),eval转成了str(types.StringType)。

2、json不认单引号,json中的字符串需要用双引号包起来

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值