【问题标题】:why JSON.parse() is not working in my code?为什么 JSON.parse() 在我的代码中不起作用?
【发布时间】:2018-11-08 21:29:17
【问题描述】:

我正在使用 Django 并尝试直接使用 javascript 获取数据。这里有一些代码。在idx_map.html中,JS部分是这样的:

 var act = '{{ activities_json }}';

    document.getElementById("json").innerHTML = act[0];

    var obj = JSON.parse(act);

    document.getElementById("demo").innerHTML = 1;

我正在尝试查找错误,因此我将一些代码用于将行输出到页面。问题是JSON.parse() 行。如果我评论该行,我可以在我的 HTML 页面中看到 [ 和 1,这意味着还没有错误。但是如果我取消注释 JSON.parse() 行,我就看不到 1,这表明 JSON.parse() 代码有一些错误。但是我没有发现任何问题。有人可以帮我吗?

在views.py中,我将对象序列化为一个json文件。代码是:

def map(request):
activities_json = serializers.serialize("json", Activities.objects.all())
context = {
    "activities": Activities.objects.all(),
    "activities_json": activities_json,
}
return render(request, "CS_Activities/idx_map.html", context)

所以这个行为应该是这样的(作为一个字符串?):

[
    {"model": "CS_Activities.activities", "pk": 1, "fields": {"act_name": "gun shot", "location": "York Universitty", "loc_lat": 43.76776, "loc_long": -79.50297, "time": "2018-11-05T20:25:08Z", "description": "a people dead"}}, {"model": "CS_Activities.activities", "pk": 2, "fields": {"act_name": "another gun shot", "location": "York Village", "loc_lat": 43.76, "loc_long": -79.5, "time": "2018-11-05T22:35:06Z", "description": "A person shot dead while walking"}}
]

更新: 在 idx_map.html 中,如果我只是将 var 替换为长字符串,就不会出现错误。所以我认为我的问题是如何从 Django 数据库中以 json 文件格式检索数据。

【问题讨论】:

  • '{{ activities_json }}' 不是有效的 json,但您后面的示例似乎是。
  • 您应该能够直接打印服务器端 json 而无需在其周围加上引号,并且不需要使用 JSON.parse()。然后javascript编译器会看到类似var act = [{"model".... ]的东西,它已经是javascript数组
  • 尝试使用'{{ activities_json|safe }}'。 toString() 不是必须的,它已经是一个字符串了。
  • 为什么用pythondjango标记?
  • 马蒂亚斯,我正在使用 Django。在views.py 中,我将对象序列化为JSON,以便在HTML 页面的javascript 中使用它。这就是我使用 act = '{{ activities_json }}' 来查询数据的原因。

标签: javascript python json django


【解决方案1】:

您需要使用safe 将字符串(在本例中为 JSON)标记为在输出之前不需要进一步的 HTML 转义。

var act = '{{ activities_json|safe }}';

这部分代码:

document.getElementById("json").innerHTML = act[0];

只获取字符串的第一个元素,即[.

这部分代码

var obj = JSON.parse(act);

返回错误,因为您之前没有使用safe,并且引号(“)在模板中输出为&quote;,这是无效的。我猜你想要这样的东西:

var act = '{{ activities_json|safe }}';
var lat = 43.767760;
var lng = -79.502970;
var latLng = {lat: lat, lng: lng};       

var obj = JSON.parse(act);
document.getElementById("json").innerHTML = obj[0];

现在obj[0] 将返回第一个 JSON 元素,但我不确定你想用它做什么。

【讨论】:

  • 感谢您的回复!尝试添加安全但仍然无法正常工作。我更新了我的问题,你介意再看一下吗?谢谢。
  • 什么不起作用?您需要添加的不仅仅是safe,您还需要将act[0] 更改为obj[0],并在此之前将字符串解析为JSON。
猜你喜欢
  • 2023-03-03
  • 2018-03-05
  • 2014-01-23
  • 2013-08-06
  • 2021-03-17
  • 2018-04-24
  • 2019-01-07
  • 2014-04-28
相关资源
最近更新 更多