【问题标题】:How to convert a list of dictionaries to JSON in Python / Django?如何在 Python / Django 中将字典列表转换为 JSON?
【发布时间】:2016-10-20 22:59:48
【问题描述】:

我在 Google 上搜索并找到了答案,但它不适合我。我必须在 Django 中以JsonResponse 的形式发送一个列表,类似于:

list_to_json =[{"title": "hello there",
                "link": "www.domain.com",
                "date":   ...},
               {},{},{},...]

我通过应用 StackOverflow question1question2 将其转换为 JSON,但这对我不起作用。我收到以下错误:

为了允许非字典对象被序列化,请将安全参数设置为 False

这是我的代码:

    def json_response(request):
        list_to_json=[{"title": ..., "link": ..., "date": ...},{...}]
        return JsonResponse(json.dumps(list_to_json) )

【问题讨论】:

  • 这能解决你的问题吗:return JsonResponse(json.dumps(list_to_json), safe=False)?
  • 示例第二行中的 python dict 无效。还请包括完整的堆栈跟踪。否则很难遵循 IMO
  • JsonResponse 的全部意义在于它将为您序列化数据。对数据调用json.dumps() 会对其进行两次编码。

标签: python json django


【解决方案1】:
return JsonResponse(list_to_json, safe=False)

看看documentation

安全布尔参数默认为 True。如果设置为 False,则可以传递任何对象进行序列化(否则只允许 dict 实例)。如果 safe 为 True 并且非字典对象作为第一个参数传递,则会引发 TypeError。

【讨论】:

  • Ahop 就像一个字符串返回列表。
  • 工作有点魅力
【解决方案2】:

为任何想知道为什么默认情况下不“安全”的人添加此答案。将非字典数据结构打包到响应中会使服务容易受到 ES5 之前的 JSON 劫持攻击。

基本上,使用您在此处使用的 JSONResponse,如果用户通过了您网站的身份验证,他现在可以检索 {title, link, date} 对象的列表,这很好。但是,攻击者可以将该端点作为脚本源包含在他自己的恶意页面上(跨站脚本包含,也称为 XSSI):

<script src="https://www.yourwebsite.com/secretlinks/"></script>

然后,如果毫无戒心的经过身份验证的用户导航到恶意页面,浏览器会在不知不觉中从您的站点请求数据数组。由于您的服务只是返回一个未分配的数组,因此攻击者还必须毒害 js Array 构造函数(这是 ES5 中修复的攻击部分)。 在 ES5 之前,攻击者可以像这样简单地覆盖 Array 构造函数:

Array = function() {secret = this;}

现在secret 包含您的字典列表,并且可供攻击者脚本的其余部分使用,他可以将其发送到他自己的服务器。 ES5 通过强制使用括号由默认的 Array 构造函数计算来解决此问题。

为什么这对字典对象来说不是问题?仅仅是因为 javascript 中的大括号表示一个孤立的范围,因此攻击者无法将自己的代码注入到由大括号包围的返回字典创建的范围中。

更多信息在这里:https://security.stackexchange.com/questions/159609/how-is-it-possible-to-poison-javascript-array-constructor-and-how-does-ecmascrip?newreg=c70030debbca44248f54cec4cdf761bb

【讨论】:

    【解决方案3】:

    您必须包含序列化程序,或者您可以通过对响应数据使用 safe= False 来做到这一点。
    喜欢

    return JsonResponse(list_to_json, safe=False)
    

    【讨论】:

    • 我认为我使用序列化程序提到了一些新的东西。但是谢谢
    【解决方案4】:

    这不是一本有效的字典:

    {"title": , "link" : , "date": }
    

    因为缺少值。 如果您尝试添加缺失值,则效果很好:

    >>> json.dumps([{"title": "hello there", "link": "www.domain.com", "date": 2016}, {}])
    '[{"link": "www.domain.com", "date": 2016, "title": "hello there"}, {}]'
    

    【讨论】:

    • 我知道。
    • @shuboy2014 那么你应该期望任何东西都能处理语法错误。
    猜你喜欢
    • 1970-01-01
    • 2017-07-02
    • 2014-02-26
    • 1970-01-01
    • 2021-02-03
    • 2012-07-12
    • 2020-11-02
    • 2015-05-17
    • 1970-01-01
    相关资源
    最近更新 更多