Python将字符串转为字典最佳实践_weixin_34072857的博客-程序员秘密

技术标签: python  json  

在工作中我们经常会遇到数据类型之间的互转的问题,而通常我们请求一些API借口返回的结果就是字符串,但是格式是Json的,在Python中转为字典是最易处理的,所以这里记录一下在Python下把字符串转为字典的三种方法。

方法一: 通过内置函数eval

Source Code:

#!/usr/bin/env python3
#Author: nock.chen

str_info = "{'name': 'nock', 'age': 14}"
dict_info = eval(str_info)

print("string info type is -->: %s" % (type(str_info)))
print("dict info type is -->: %s" % (type(dict_info)))
复制代码

Result:

string info type is -->: <class 'str'>
dict info type is -->: <class 'dict'>
复制代码

不过使用eval有一个安全性问题,示例如下:

Source Code:

#!/usr/bin/env python3
#Author: nock.chen

str_info = input('input str info: ')
dict_info = eval(str_info)

print("dict_info is >%s< " % dict_info)
复制代码

Result:

input str info: __import__('os').system('ls')
collector_data.py
test.py
Download
dict_info is >0< 
复制代码

如上所示当我们输入__import__('os').system('ls')的时候会打印出脚本所存目录下的文件,如果传入一个rm -rf *之类的命令,那则会把所有改目录下的东西删除掉;当然我们这么去用的场景会非常好少,也不可能有人会这么传值,不过这里说明一下。

方法二: 通过json模块处理

Source Code:

#!/usr/bin/env python3
#Author: nock.chen

import json

str_info = '{"name": "nock", "age": 18}'
dict_info = json.loads(str_info)

print("string info type is -->: %s" % (type(str_info)))
print("dict info type is -->: %s" % (type(dict_info)))
复制代码

Result:

string info type is -->: <class 'str'>
dict info type is -->: <class 'dict'>
复制代码

使用json模块进行转换也存在一个问题,由于json语法规定 数组或对象之中的字符串必须使用双引号,不能使用单引号, 官网上有一段描述是:

报错示例如下:

#!/usr/bin/env python3
#Author: nock.chen

import json
str_info = "{'name': 'nock', 'age': 18}"
dict_info = json.loads(str_info)
复制代码

报错结果如下:

Traceback (most recent call last):
  File "test.py", line 7, in <module>
    dict_info = json.loads(str_info)
  File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/__init__.py", line 319, in loads
    return _default_decoder.decode(s)
  File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/decoder.py", line 339, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/decoder.py", line 355, 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)
复制代码

方法三: 通过ast模块处理

Source Code:

#!/usr/bin/env python3
#Author: nock.chen

import ast
str_info = '{"name": "nock", "age": 18}'
dict_info = ast.literal_eval(str_info)

print("string info type is -->: %s" % (type(str_info)))
print("dict info type is -->: %s" % (type(dict_info)))

s_info = "{'name': 'nock', 'age': 18}"
d_info = ast.literal_eval(s_info)

print("s info type is -->: %s" % (type(s_info)))
print("d info type is -->: %s" % (type(d_info)))
复制代码

Result:

string info type is -->: <class 'str'>
dict info type is -->: <class 'dict'>
s info type is -->: <class 'str'>
d info type is -->: <class 'dict'>
复制代码

使用ast.literal_eval进行转换既不存在使用json 模块进行转换的问题,也不存在使用eval模块进行转换的安全性问题,因此推荐大家使用ast.literal_eval的方法。

转载于:https://juejin.im/post/5b34d3f86fb9a00e38584924

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34072857/article/details/91436209

智能推荐

矿大BXSCTF-RE-KeygenMe_ctf [email protected]_Wwoc的博客-程序员秘密

题目链接 http://download.bxsteam.xyz/re/Easy%20Keygen.exe把文件拖入IDA,找到main函数F5反编译由于本人基础原因,百度查了下sprintf函数才明白题目的简单.附上sprint函数详解:https://blog.csdn.net/oyhb_1992/article/details/75095472流程大致为: 输入一个fla...

集合划分问题(分治)_n个不同数字被分成m组,可以为空,有多少种不同的组合方式_hnu哈哈的博客-程序员秘密

集合划分问题(分治)二、问题分析:1.将n个元素分成m个非空集合有f(n,m)种不同的分法。2.问题分解,考虑第一个元素,它只有两种情况:①第1个元素放入其余n-1个元素组成的m个集合中,有m种不同的放法。②第1个元素组成一个子集,其余n-1个元素组成m-1个集合。3.递推方程:f(n,m)=m*f(n-1,m)+f(n-1,m-1)代码:int Di...

【Android 文件管理】分区存储 ( 修改与删除图片文件 )_韩曙亮的博客-程序员秘密

一、分区存储模式下使用 MediaStore 修改图片、二、分区存储模式下使用 MediaStore 删除图片、三、相关文档资料、

记一次生产数据库连接池大量连接超时问题排查_连接池 链接超时重试阻塞_梦回雨街的博客-程序员秘密

最近一段时间公司业务量上来了,与此同时伴随着程序猿终生的问题出现了。服务异常总体的表现就是每天不定时间出现访问超时并持续一段时间,偶尔又好了。刚开始出现次数很少,服务中断一小段时间后就自己恢复了。但随着时间推移,这种情况出现频率变高了,而且持续时间也变久了。老板此时的状态中断服务怎能忍,我打起了12分精神,开始排查问题,既然是数据库连接池抛出的问题,首先检查是不是数据库连接池参数出问题了,有长事务占用数据库连接不释放,并发数过多导致连接池连接耗尽,然后一顿参数调整,发现效果不大,...

可能最详细的教程,新手如何获取Zcash钱包(ZEC)官方地址的方法_squirrel1311的博客-程序员秘密

折腾了2天,终于折腾出了Zcash的官方地址了(非第三方交易平台的)先上个图,有图有真相嘛,哈哈,图片有水印,看下面那个命令也是获取钱包地址的好了,开始上教程,我这边使用的是昨天在虚拟机安装的深度系统,什么是深度系统,自己百度,我也不知道,哈哈(具体怎么在虚拟机安装系统,可以直接去深度官网查)第一步,打开深度系统的命令窗口,类似于Windows的CMD(好像是这样,高手勿喷

解决 android.content.ActivityNotFoundException: No Activity found to handle Intent 问题_.content not found._androidWorkor的博客-程序员秘密

如下的报错:android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW cat=[android.intent.category.DEFAULT] dat=content://***.fileProvider/files_root/A...

随便推点

剑指offer-调整数组顺序使奇数位于偶数前面(python)_bo.qiu_xbw的博客-程序员秘密

这题两个思路,一个比较好想就是在建一个列表,从头到尾遍历,但我感觉题目不是这个意思,应该是原地变换(卡了很久,一直不懂相对位置不变是什么意思,估计就是说找一个稳定的排序算法???)# -*- coding:utf-8 -*-class Solution: def reOrderArray(self, array): # write code here f...

代码保护软件VMProtect控制面板“项目”部分都有哪些功能选项?_Lee-Shyllen的博客-程序员秘密

VMProtect是一种很可靠的工具,可以保护应用程序代码免受分析和破解,但只有在应用程序内保护机制正确构建且没有可能破坏整个保护的严重错误的情况下,才能实现最好的效果。【下载VMProtect最新试用版】接下来为大家介绍关于VMProtect主窗口中的控制面板,其中包括:“项目”部分、“功能”部分和“详情”部分。本章将对其中的“项目部分”进行详细介绍。“项目”部分“项目”部分包括以下小...

服务器ubuntu系统安装cuda_11.1.0_455.23.05_linux.run、cudnn-11.1-linux-x64-v8.0.4.30.tgz和docker安装_ubuntu安装cuda11.1_好学的小赵的博客-程序员秘密

准备工作一、nvidia1.卸载旧驱动2.查看适合本机的nvidia驱动**3.根据自身情况选择适合的nvidia版本,我这里安装的是nvidia-4603.重启一下二、CUDA cuda_11.1.0_455.23.05_linux.run1.CUDA下载2.nouveau驱动3.执行安装脚本4.添加环境变量5.验证二、CUDNN cudnn-11.1-linux-x64-v8.0.4.30.tgz1.下载对应版本的文件2.解压cudnn3.将解压文件放到指定位置4.验证.

HDU 1251 统计难题(经典字典树)_高中统计典型难题_unhurried_swordsman的博客-程序员秘密

字典树:又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。

-------PAT乙级--1004_younghaodaydayupup的博客-程序员秘密

1004. 成绩排名 (20)时间限制400 ms内存限制65536 kB代码长度限制8000 B判题程序Standard作者CHEN, Yue读入n名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。输入格式:每个测试输入包含1个测试用例,格式为 第1行:正整数n 第2行:第1个学生的姓名 学号 成绩 第3行:第2个学生的姓名 学号 成绩 ... ......

推荐文章

热门文章

相关标签