zoukankan      html  css  js  c++  java
  • python 将列表嵌套字典的unicode字符串转换为str格式的字符串的方法

    今天在进行django开发的过程中遇到了一个非常棘手的问题, 因为需求原因, 需要将一份数据存为json格式到数据库中, 如下面这种格式:

    list_1 = [{"name":"lowman", "age":"18"},{"name":"lowman1", "age":None}]

    开发环境是python2, 在后端接收到数据,打印数据是这样的:

    [{u"name":u"lowman", u"age":u"18"},{u"name":u"lowman1", u"age":None}]

    里面的所有的字符串元素都是unicode类型的, 如果不使用json.dumps()进行转换直接保存到数据库中(TextField),然后再取出,是这样格式的数据(编码后保存还是unicode类型, 数据库编码格式是utf-8)

    u'[{u"name":u"lowman", u"age":u"18"},{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': '18'}, {'name': 'lowman1', 'age': None}]
    <class 'int'>
    123

    回到原来的需求:

    先使用eval() 处理后端接收到的数据, 再使用json.dumps()进行处理, 然后保存到数据库, 数据形式是这样的(话说这样格式的数据其实才是满足我们本次需求的)

    [{'name': 'lowman', 'age': '18'}, {'name': 'lowman1', 'age': None}]

    这时, 保存到数据库中的数据才是一个json格式的数据, 当想要向前端返回数据时, 使用json.loads() 或者仍然使用eval()函数进行处理一下从数据库中取出的数据, 再使用Django rest framework 的 Respose() 向前端进行返回.前端发送ajax请求成功后接收到数据格式是这样的(注意这时对应到Python字典数据的键是没有引号的):

    [{name: 'lowman', age: '18'}, {name: 'lowman1', age: None}]

    至此,问题解决, eval 果然神奇......................................................................

    经过一位大佬的提醒,这样子使用 eval 函数,是存在安全性问题的(比如数据中存在脚本代码,或者 sql 语句),事实上 eval 是一个非常强大的函数,它具备了很多实用的功能,但是如果对于数据源不具备可信任性,可以使用 ast.literal_eval 进行替代,特别是在进行 web server 开发时,需要接收处理前端传递的参数。。。

  • 相关阅读:
    最大的错误就是没有把自己的软件开发事业当 作一桩生意来看待
    python:open/文件操作
    Python 之ConfigParser
    Python 之ConfigParser
    Python 之ConfigParser
    python的time模块使用
    python的time模块使用
    python的time模块使用
    国外、国内各大OJ
    国外、国内各大OJ
  • 原文地址:https://www.cnblogs.com/lowmanisbusy/p/9135917.html
Copyright © 2011-2022 走看看