python 将列表嵌套字典的unicode字符串转换为str格式的字符串的方法
今天在进行django开发的过程中遇到了一个非常棘手的问题, 因为需求原因, 需要将一份数据存为json格式到数据库中, 如下面这种格式:
list_1 = [{"name":"lowman", "age":"18"},{"name":"lowman1", "age":None}]
开发环境是python2, 在后端接收到数据,打印数据是这样的:
[{u"name":u"lowman", u"age":u""},{u"name":u"lowman1", u"age":None}]
里面的所有的字符串元素都是unicode类型的, 如果不使用json.dumps()进行转换直接保存到数据库中(TextField),然后再取出,是这样格式的数据(编码后保存还是unicode类型, 数据库编码格式是utf-8)
u'[{u"name":u"lowman", u"age":u""},{u"name":u"lowman1", u"age":None}]'
这时如果使用json.loads()进行转换, 会抛出异常(使用json.loads(),元素不可以是unicode类型), 但是如果使用json.dumps()将数据进行一下转换,再保存到数据库中时,却是这样的数据形式
"[{u'name':u'lowman', u'age':u'18'},{u'name':u'lowman1', u'age':None}]"
这时使用json.loads()进行转换后,再使用django rest framework 的 Response() 向前端进行返回, 前端接收的数据却是这样的, 且无法转化为list数据
"[{u'name':u'lowman', u'age':u'18'},{u'name':u'lowman1', u'age':None}]"
各种求解无果,问题症结就在列表嵌套字典, 在我的环境里进行encode() 企图将数据转换为str格式的字符串时无法作用到里面的一层数据, 字典的元素仍然是unicode类型, 各种磨难寻找后, 终于发现了一个神器, 那就是eval() 函数, 它可以神奇的将最外层的数据的双引号或者单引号去掉, 转换为原始格式的数据, 并且可以将里面所有的unicode元素字符串转换为str格式的字符串
list_str = u'[{u"name":u"lowman", u"age":"18"},{u"name":u"lowman1", u"age":None}]'
list_str = eval(list_str)
print(type(list_str))
print(list_str)
my_str = "123"
my_str = eval(my_str)
print(type(my_str))
print(my_str)
输出结果
<class 'list'>
[{'name': 'lowman', 'age': ''}, {'name': 'lowman1', 'age': None}]
<class 'int'>
123
回到原来的需求:
先使用eval() 处理后端接收到的数据, 再使用json.dumps()进行处理, 然后保存到数据库, 数据形式是这样的(话说这样格式的数据其实才是满足我们本次需求的)
[{'name': 'lowman', 'age': ''}, {'name': 'lowman1', 'age': None}]
这时, 保存到数据库中的数据才是一个json格式的数据, 当想要向前端返回数据时, 使用json.loads() 或者仍然使用eval()函数进行处理一下从数据库中取出的数据, 再使用Django rest framework 的 Respose() 向前端进行返回.前端发送ajax请求成功后接收到数据格式是这样的(注意这时对应到Python字典数据的键是没有引号的):
[{name: 'lowman', age: ''}, {name: 'lowman1', age: None}]
至此,问题解决, eval 果然神奇......................................................................
经过一位大佬的提醒,这样子使用 eval 函数,是存在安全性问题的(比如数据中存在脚本代码,或者 sql 语句),事实上 eval 是一个非常强大的函数,它具备了很多实用的功能,但是如果对于数据源不具备可信任性,可以使用 ast.literal_eval 进行替代,特别是在进行 web server 开发时,需要接收处理前端传递的参数。。。
python 将列表嵌套字典的unicode字符串转换为str格式的字符串的方法的更多相关文章
- python关于字典嵌套字典,列表嵌套字典根据值进行排序
python 对于字典嵌套字典, 列表嵌套字典排序 例:列表嵌套自字典:d = [{"name": '张三', 's': 68}, {'name': '李四', 's': 97}] ...
- 【笔试题】怎样将 GB2312 编码的字符串转换为 ISO-8859-1 编码的字符串?
笔试题 怎样将 GB2312 编码的字符串转换为 ISO-8859-1 编码的字符串? import java.io.UnsupportedEncodingException; public clas ...
- mysql内置函数,在mysql里面利用str_to_date()把字符串转换为日期格式
mysql内置函数,在mysql里面利用str_to_date()把字符串转换为日期格式 示例:分隔符一致,年月日要用%号 select str_to_date('2008-4-2 15:3:28', ...
- 使用ParseExact方法将字符串转换为日期格式
实现效果: 知识运用: DateTime结构的ParseExact方法 public static DateTime ParseExact(string s,string format,IFormat ...
- 007——转载——C#将字符串转换为整型的三种方法的总结
(一)转载——C#将字符串转换为整型的三种方法的总结 在C#中,要将一个字符串或浮点数转换为整数,基本上有三种方法: (1)使用强制类型转换:(int)浮点数 (2)使用Convert.ToInt32 ...
- postgresql数据库的 to_date 和 to_timestamp 将 字符串转换为时间格式
数据库中:字符串 转换为 时间格式 二者区别: to_data 转换为 普通的时间格式 to_timestamp 转换可为 时间戳格式出错场景: 比较同一天 日期大小的时候,很容易出错 ...
- python数组列表、字典、拷贝、字符串
python中字符串方法 name = "I teased at life as if it were a foolish game" print(name.capitalize( ...
- Python 7 列表 for 字典,嵌套
列表: 基本格式:变量名 = [元素1,元素2,元素3] 创建:A = ['访客','admin',19] 或 A = list(['armin','admin',19]), 后者更倾向于转换为 ...
- python(字符串、列表、字典、元组、集合)的常用内置方法
一.字符串: lis='my name is maple' res=lis.count('m')#计算字符串内相同字符的个数 print(res) lis='my name is maple' res ...
随机推荐
- Maven(一) Maven3 的安装与配置
Maven的安装以及环境变量的配置: a).在安装maven之前,先确保已经安装JDK1.7及以上版本,并且配置好JDK的环境变量. b).下载maven3,下载地址:http://maven.apa ...
- 什么是2MSL
[什么是2MSL] MSL是Maximum Segment Lifetime英文的缩写,中文可以译为“报文最大生存时间”,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃.因为tcp报文( ...
- [JAVA][StringUtils]字符串工具类的常用方
StringUtils 方法的操作对象是 java.lang.String 类型的对象,是 JDK 提供的 String 类型操作方法的补充,并且是 null 安全的(即如果输入参数 String 为 ...
- 33-wxpython多个frame之间的信息共享
https://blog.csdn.net/xyisv/article/details/78576932 https://blog.csdn.net/tianmaxingkong_/article/d ...
- Window Application has "update" key words
Error Qt Creater:console error:Failed to start program. Path or permissions wrong? Description 在使用Qt ...
- Pwdump v7.1
提取windows系统密码 和 hash值
- numpy中三维数组转变成二维数组
numpy中reshape()函数对三维数组进行转换成二维数组,见下面例子: >>>a=np.reshape(np.arange(18),(3,3,2)) >>> ...
- vue项目 调用百度地图 BMap is not defined
这次老板新接了一个四点半官网页面,使用vue来写.emm……我感觉整个人都不好了,两天半解决了20个静态页面.还好vue写页面简直飞快,遇到一个vue的新坑,使用百度地图. 研究了好一会,总是报错BM ...
- Djanjo 的app 模板路径 静态文件 完整版登录 新手三件套 以及orm
一: django中app的概念: 一个项目可以包含多个应用(app,类似于模块,主页打开多个模块就是多个app) 创建了app,要在配置文件中注册 二:模板路径配置: 1 templates文件夹 ...
- 前端福利之HTML5 UTF-8 中文乱码(转)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...