今天在进行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格式的字符串的方法的更多相关文章

  1. python关于字典嵌套字典,列表嵌套字典根据值进行排序

    python 对于字典嵌套字典, 列表嵌套字典排序 例:列表嵌套自字典:d = [{"name": '张三', 's': 68}, {'name': '李四', 's': 97}] ...

  2. 【笔试题】怎样将 GB2312 编码的字符串转换为 ISO-8859-1 编码的字符串?

    笔试题 怎样将 GB2312 编码的字符串转换为 ISO-8859-1 编码的字符串? import java.io.UnsupportedEncodingException; public clas ...

  3. mysql内置函数,在mysql里面利用str_to_date()把字符串转换为日期格式

    mysql内置函数,在mysql里面利用str_to_date()把字符串转换为日期格式 示例:分隔符一致,年月日要用%号 select str_to_date('2008-4-2 15:3:28', ...

  4. 使用ParseExact方法将字符串转换为日期格式

    实现效果: 知识运用: DateTime结构的ParseExact方法 public static DateTime ParseExact(string s,string format,IFormat ...

  5. 007——转载——C#将字符串转换为整型的三种方法的总结

    (一)转载——C#将字符串转换为整型的三种方法的总结 在C#中,要将一个字符串或浮点数转换为整数,基本上有三种方法: (1)使用强制类型转换:(int)浮点数 (2)使用Convert.ToInt32 ...

  6. postgresql数据库的 to_date 和 to_timestamp 将 字符串转换为时间格式

    数据库中:字符串 转换为 时间格式 二者区别: to_data 转换为 普通的时间格式        to_timestamp 转换可为 时间戳格式出错场景: 比较同一天 日期大小的时候,很容易出错 ...

  7. python数组列表、字典、拷贝、字符串

    python中字符串方法 name = "I teased at life as if it were a foolish game" print(name.capitalize( ...

  8. Python 7 列表 for 字典,嵌套

    列表: 基本格式:变量名 = [元素1,元素2,元素3] 创建:A = ['访客','admin',19]  或  A = list(['armin','admin',19]),  后者更倾向于转换为 ...

  9. python(字符串、列表、字典、元组、集合)的常用内置方法

    一.字符串: lis='my name is maple' res=lis.count('m')#计算字符串内相同字符的个数 print(res) lis='my name is maple' res ...

随机推荐

  1. Multithread之为什么spinlock必须是volatile?

    [Multithread之为什么spinlock必须是volatile?] 1.编译器的优化 在本次线程内,当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中:以后再取变量 ...

  2. 2015年传智播客JavaEE 第168期就业班视频教程14-登录功能需求分析+模块结构命名规范

    得先造一个模块,来封装我们的员工模型.登录的就是我们的员工嘛.员工模块属于权限校验系列的,校验叫做auth.进销存模块叫做cn.itcast.erp.invoice.权限模块叫做cn.itcast.e ...

  3. OPENSSL 生成https 客户端证书

    下面说下拿服务器证书.(前提是服务器是https,客户端认证用的时候),服务端不给的时候,我们自己去拿(不给怼他!,哈哈,开个玩笑,都会给的) openssl s_client -connect 域名 ...

  4. ios7 导航栏适配

    ios ui开发过程中,经常会使用到导航栏,默认的样式比较单一,所以经常需要修改导航栏的样式 ios4: - (void)drawRect:(CGRect)rect { UIImage *image ...

  5. [SQL]查询数据库中具有某个字段名的表

    SELECT t.name AS table_name, c.name AS column_name FROM XOIFundData.sys.tables AS t INNER JOIN XOIFu ...

  6. C程序设计语言(2)文摘

    第一章 导言 1.1 入门 1.2 变量与算术表达式 1.3 for语句 1.4 符号常量 1.5 字符输入输出 #include "stdafx.h" main(int argc ...

  7. sqlserver2012 清除日志

    1. backup log wwgl_demo to disk='D:\DATA_BACKUP\2017-07-19.log' 2. 右键数据库-->任务-->收缩-->文件     ...

  8. windows平台下spark-shell配置

    一.下载安装spark,http://spark.apache.org/,选择合适版本后下载到本地,解压,bin目录下spark-shell文件就是spark命令行交互的入口. 二.下载安装windo ...

  9. Hello_Depth_Perception 任务二:Project Tango采集深度感知数据

    Java API Depth Perception Tutorial深度感知教程 Configuration 配置信息 In order to use depth perception, your T ...

  10. 1、Docker介绍

      Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化.容器完全使用沙箱机制,相互之间不会有任何接口 ...