eval()与json.loads()都是将字json符串转换成json对象
对于普通的数据类型,json.loads()和eval()都可以使用:
import json
str = '{"a":1,"b":2}'
dir = eval(str)
print(type(dir),dir)
dir1 = json.loads(str)
print(type(dir1),dir1)
>>><class 'dict'> {'a': 1, 'b': 2}
>>><class 'dict'> {'a': 1, 'b': 2}
在遇到特殊类型的时候,eval就不管用了。eval通常用来执行一个字符串表达式,并返回表达式的值。比如:
str = '{"a":true,"b":2}'
dir = eval(str)
print(type(dir),dir)
报错:
Traceback (most recent call last):
File "D:/dongjieware/pycharm/api_test11-6/temp/temp1.py", line 3, in <module>
dir = eval(str)
File "<string>", line 1, in <module>
NameError: name 'true' is not defined
import json
str = '{"a":true,"b":2}'
dir1 = json.loads(str)
print(type(dir1),dir1)
>>><class 'dict'> {'a': True, 'b': 2}
json不认元素上的单引号,json字符串中的key需要用双引号包起来。
import json
str = "{'a':1,'b':2}"
dir1 = json.loads(str)
print(type(dir1),dir1)
>>>Traceback (most recent call last):
>>> File "D:/dongjieware/pycharm/api_test11-6/temp/temp1.py", line 7, in <module>
>>>dir1 = json.loads(str)
>>>File "C:\Users\xfx-pc\AppData\Local\Programs\Python\Python37\lib\json\__init__.py", >>>line 348, in loads
>>> return _default_decoder.decode(s)
>>>File "C:\Users\xfx-pc\AppData\Local\Programs\Python\Python37\lib\json\decoder.py", >>>line 337, in decode
>>> obj, end = self.raw_decode(s, idx=_w(s, 0).end())
>>>File "C:\Users\xfx-pc\AppData\Local\Programs\Python\Python37\lib\json\decoder.py", >>>line 353, in raw_decode
>>>obj, end = self.scan_once(s, idx)
>>>json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line >>>1 column 2 (char 1)
终上所述,json与eval区别有两点:
1、json.loads()与eval()都能将s转成python中的对象,json.loads将json中的字符串转成unicode(types.UnicodeType),eval转成了str(types.StringType)。
2、json不认单引号,json中的字符串需要用双引号包起来
本文探讨了Python中json.loads和eval函数在转换JSON字符串到对象时的区别。尽管两者都可用于数据转换,但json.loads更适用于JSON数据,它将字符串转化为Unicode,而eval则能执行字符串表达式。值得注意的是,JSON标准要求使用双引号,而eval对此无限制。
2549

被折叠的 条评论
为什么被折叠?



