【问题标题】:Trying to JSON.parse serialized data from Django尝试 JSON.parse 来自 Django 的序列化数据
【发布时间】:2023-03-21 19:35:01
【问题描述】:

我想使用 Javascript 在客户端上做一些事情。我在我的视图中以 JSON 格式从我的模型中序列化一个查询集并将其发送到模板。

data = serializers.serialize("json", Profile.objects.filter(user_id=self.request.user))

我最终得到了这个:

var data = '[
                {
                    "model": "accounts.profile", 
                    "pk": 14, 
                    "fields": {
                        "user": 14, 
                        "email_confirmed": true, 
                        "encrypted_private_key": "Z0FBQUFBQmJLQT09", 
                        "public_key": "LS0tLSS0tLQo=", 
                        "salt": "I8rzovcWsKm4G5Pj3E4DMw=="
                              }
                }
            ]';

当我尝试这样做时:

var data = JSON.parse('{{ data|safe }}');

我收到一个错误

Uncaught SyntaxError: Unexpected token { in JSON at position 1

谁能帮忙?

【问题讨论】:

  • 这是否意味着 JSON 不能以 [ 开头?可能你需要这样的改变:Profile.objects.filter(user_id=self.request.user)[0]?
  • 尝试将{{ data|safe }}JSON.parse(variable_name) 之前的变量一起使用,
  • 不幸的是,您的建议都没有奏效。我尝试在我的 HTML 文件中创建一个全局变量,如 var data = {{ data|safe }}; 并从我的 javascript 文件中访问它,但它给出了相同的错误。我尝试使用和不使用引号以及反引号设置变量

标签: javascript arrays json django


【解决方案1】:

你的字符串包含换行符,所以

var data = JSON.parse('{{ data|safe }}');

不会工作。尝试使用反引号(不知道如何在此处输入)而不是 '

但是,如果你已经将数据dump到json中,则不需要在JS端解析,直接做

var data = {{ data|safe }}; 

更新:注意,上面的模板变量没有引号,上面会变成(查看源代码):

var data = [
            {
                "model": "accounts.profile", 
                "pk": 14, 
                "fields": {
                    "user": 14, 
                    "email_confirmed": true, 
                    "encrypted_private_key": "Z0FBQUFBQmJLQT09", 
                    "public_key": "LS0tLSS0tLQo=", 
                    "salt": "I8rzovcWsKm4G5Pj3E4DMw=="
                          }
            }
        ];

注意,它周围仍然没有引号。这是有效的 Javascript,无需进一步操作(即解析)。

update2:要在 .js 文件中使用此数据,您需要像这样更改 .js 文件:

var some_unique_name = function (data) {
    ... original code goes here ...
};

在你的 html 中:

<script src="...your script"></script>
<script>
    some_unique_name({{ data|safe }});
</script>

update3:以上将扩展为(使用浏览器的查看源功能检查):

<script src="...your script"></script>
<script>
    some_unique_name([
            {
                "model": "accounts.profile", 
                "pk": 14, 
                "fields": {
                    "user": 14, 
                    "email_confirmed": true, 
                    "encrypted_private_key": "Z0FBQUFBQmJLQT09", 
                    "public_key": "LS0tLSS0tLQo=", 
                    "salt": "I8rzovcWsKm4G5Pj3E4DMw=="
                          }
            }
        ]);
</script>

这是有效的javascript。但是,您不能在 html 事件处理程序中盲目地做同样的事情,因为

<button type="button" onclick="some_unique_name({{ data|safe }})" ...>

将扩展为

    <button type="button" onclick="some_unique_name([
            {
                "model": "accounts.profile",    // syntax error here..
                "pk": 14, 
                "fields": {
                    "user": 14, 
                    "email_confirmed": true, 
                    "encrypted_private_key": "Z0FBQUFBQmJLQT09", 
                    "public_key": "LS0tLSS0tLQo=", 
                    "salt": "I8rzovcWsKm4G5Pj3E4DMw=="
                          }
            }
        ])" ...>

浏览器会看到的

<button type="button" onclick="some_unique_name([{"

它不明白。

如果我们暂时忽略 Django,有两个明显的解决方法:

(1)把函数的参数放在一个变量中:

<script>
    var my_variable = [
            {
                "model": "accounts.profile",    // syntax error here..
                "pk": 14, 
                "fields": {
                    "user": 14, 
                    "email_confirmed": true, 
                    "encrypted_private_key": "Z0FBQUFBQmJLQT09", 
                    "public_key": "LS0tLSS0tLQo=", 
                    "salt": "I8rzovcWsKm4G5Pj3E4DMw=="
                          }
            }
        ];
</script>
<button type="button" onclick="some_unique_name(my_variable);">..</button>

(2) 或将调用包装在一个函数中:

<script>
    var foo = function () {
        some_unique_name([
            {
                "model": "accounts.profile",    // syntax error here..
                "pk": 14, 
                "fields": {
                    "user": 14, 
                    "email_confirmed": true, 
                    "encrypted_private_key": "Z0FBQUFBQmJLQT09", 
                    "public_key": "LS0tLSS0tLQo=", 
                    "salt": "I8rzovcWsKm4G5Pj3E4DMw=="
                          }
            }
        ]);
    };
</script>
<button type="button" onclick="foo();">..</button>

回到 Django,这变成了

(1)

<script>
    var my_variable = {{ data|safe }};
</script>
<button type="button" onclick="some_unique_name(my_variable);">..</button>

(2)

<script>
    var foo = function () {
        some_unique_name({{ data|safe }});
    };
</script>
<button type="button" onclick="foo();">..</button>

【讨论】:

  • 我想将 JSON 数组转换为 javascript 对象,这就是我使用 JSON.parse 的原因。我尝试使用反引号,但它不起作用......
  • 没有工作不是问题描述...我要说明的是,json格式的字符串是有效的js表达式,因此您可以将其直接插入代码中,你不需要解析它。
  • 我的意思是没有工作是我已经描述过的同样的问题仍然存在。 this 是 Django 在将数据序列化为 JSON 后给我的。关于如何在不解析它​​们的情况下使用序列化数据的任何想法?
  • 是的,按照我的回答将其插入代码中。我已经更新了生成的代码,您可以使用浏览器的查看源代码功能自行检查。
  • 别担心你没有表现得不友好。我也累了。我整天都在为此工作。无论如何,我尝试了您的第一个解决方案:&lt;script&gt; var my_variable = {{ data|safe }}; &lt;/script&gt; &lt;button type="button" onclick="some_unique_name(my_variable);"&gt;..&lt;/button&gt; 这给了我一个错误,由于某种原因我现在无法真正复制......但是它点击了我,我将 onclick 参数更改为使用单引号而不是双引号并且没有效果很好。 &lt;button type="button" onclick='votingFunction({{data|safe}})'&gt;Try it&lt;/button&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-06
  • 1970-01-01
  • 2018-11-13
  • 1970-01-01
  • 2011-04-12
  • 1970-01-01
相关资源
最近更新 更多