【问题标题】:Passing a Python list using JSON and Django使用 JSON 和 Django 传递 Python 列表
【发布时间】:2010-03-12 19:29:30
【问题描述】:

我正在尝试将 Python 列表发送到客户端(编码为 JSON)。这是我写的代码sn-p:

array_to_js = [vld_id, vld_error, False]
array_to_js[2] = True
jsonValidateReturn = simplejson.dumps(array_to_js)
return HttpResponse(jsonValidateReturn, mimetype='application/json')

如何从客户端访问它?我可以像下面这样访问它吗?

jsonValidateReturn[0]

或者我如何为返回的 JSON 数组分配一个名称以便访问它?

实际上,我正在尝试转换返回数组的服务器端 Ajax 脚本(请参阅处理客户端 POST 请求的堆栈溢出问题 Creating a JSON response using Django and Python,所以我想要同样的东西作为回报Python,但它并不顺利。

【问题讨论】:

  • 您使用什么来处理响应? javascript?蟒蛇?
  • 您能否更新问题以提供更多详细信息。你有 Python 服务器吗?还有一个 Python 客户端? Python 客户端如何与服务器取得联系?客户是否使用urrlib2?这就是你在做的吗?

标签: python django json


【解决方案1】:

JSON 数组将在没有名称/分配的情况下被转储。

也就是说,为了给它一个名字,在你的 JavaScript 代码中你会做这样的事情:

var my_json_data_dump = function_that_gets_json_data();

如果你想可视化它,例如,替换:

var my_json_data_dump = { 'first_name' : Bob, 'last_name': smith };

另外,就像 Iganacio 所说,您将需要像 json2.js 这样的东西来将字符串解析为上一个示例中的对象。您可以将解析步骤包装在 function_that_gets_json_data 中,或者如果您使用 jQuery,您可以使用 jQuery.getJSON() 之类的函数来完成。

不过,json2.js 还是不错的。


回应评论(我需要空格和标记):

是的,当然。 Python 方面所做的只是为您编码一个字符串表示(JSON)。您可以执行'var blah = %s' % json.dumps(obj_to_encode) 之类的操作,然后在客户端,不是简单地将响应解析为 JSON,而是将其解析为 JavaScript。

我不推荐这个有几个原因:

  1. 您不再输出 JSON。如果您想在不需要变量名或无法解析 JavaScript 的上下文中使用它怎么办?
  2. 您正在评估 JavaScript 而不是简单地解析 JSON。这是一个存在安全漏洞的操作(如果有人可以植入数据,他们可能会执行XSS 攻击)。

我猜你正面临着我认为每个 Ajax 开发人员都会遇到的问题。您希望在您的应用程序中有一个真实的地方,但现在您被鼓励在 JavaScript 中定义变量和诸如此类的东西。所以你必须交叉引用你的 Python 代码和使用它的 JavaScript 代码。

我不会太在意它。我不明白为什么您绝对需要以这种方式从 Python 控制变量的名称。如果您指望变量名称相同,以便您可以在后续的 JavaScript 或 Python 代码中引用它,那么您可以通过简单地重组代码来避免这种情况。我并不是说这是批评,只是一个非常有用的(一般)建议!

【讨论】:

  • 有没有办法从 Python 端分配名称
【解决方案2】:

如果客户端和服务器都在 Python 中,这是您需要了解的内容。

服务器。使用字典获取字段上的标签。写下这个作为响应。

>>> import json
>>> json.dumps( {'vld_id':1,'vls_error':2,'something_else':True} )
'{"vld_id": 1, "something_else": true, "vls_error": 2}'

客户。读取响应字符串后,以这种方式创建 Python 字典。

>>> json.loads( '{"vld_id": 1, "something_else": true, "vls_error": 2}' )
{u'vld_id': 1, u'something_else': True, u'vls_error': 2}

【讨论】:

    猜你喜欢
    • 2021-01-09
    • 2015-07-08
    • 2012-11-01
    • 2012-09-27
    • 2020-11-12
    • 1970-01-01
    • 2013-03-21
    • 1970-01-01
    相关资源
    最近更新 更多