网络编程
位置:首页>> 网络编程>> Python编程>> python处理json字符串(使用json.loads而不是eval())

python处理json字符串(使用json.loads而不是eval())

作者:曲鸟  发布时间:2023-06-13 11:50:39 

标签:python,json字符串

eval 跟json.loads 是不一样的函数,是有实现不一样功能的地方,但是在某些地方它们两个函数的功能是一样的,在这个时候如果对执行效率有一定要求的话,建议不要用eval,改用json.loads会有惊喜哦。

一、eval

eval() 函数用来执行一个字符串表达式,并返回表达式的值。

二、json.loads

json.loads 用于解码 JSON 数据。该函数返回 Python 字段的数据类型。

json.loads与eval都能将json字符串转成python中的对象,但在实际工作中发现,在处理json字符串时,json.loads的性能远超eval

三、效率对比

下列代码是通过json.loads和eval方式将103KB大小的json字符串转python字典的耗时对比:


  old_data = redis_con.get('api-case-version:' + str(version_id))
           if old_data:
               l_start = datetime.datetime.now()
               load_dict = json.loads(old_data)
               l_end = datetime.datetime.now()
               print('json.loads', l_end - l_start)
               e_start = datetime.datetime.now()
               old_dict = eval(old_data)
               e_end = datetime.datetime.now()
               print('eval', e_end - e_start)

耗时对比

python处理json字符串(使用json.loads而不是eval())

耗时相差了13倍多。
在平时的场景下很难遇到处理大JSON字符串的情况,所以使用loads或eval差别可以忽略不计。但在我目前的项目中,是需要取swagger上的所有接口做对比,JSON字符串的大小经常达到1M+,这时使用loads和eval就有了较为明显的性能差异了。

但是使用json.loads有个地方需要注意一下,json.loads对列表没什么要求,但是对字典的格式有一定的要求,key值要保持是双引号的key,单引号的key或者int类型都会报错。

报错内容如下

json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

因此字典的话建议储存格式就是要用json.dumps转换成标准的json格式然后再储存成字符串。

另外如果是其他序列化格式的,对json的速度不满意的可以考虑用一下msgpack,使用方式也很简单,但是也是对格式有一定的要求,有很多博主进行过测试,都是比json快几倍以上。这里就不详讲了。

来源:https://quniao.blog.csdn.net/article/details/117706789

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com