如果我选择一个简单的ListView
,并希望返回JSON:
from django.core import serializers
from django.http import JsonResponse
class MyListView(ListView):
def get_queryset(self):
return Thing.objects.all()
def get(self, request, *args, **kwargs):
data = serializers.serialize("json", self.get_queryset())
return JsonResponse(data, status=200, safe=False)
这将使我"有效" JSON。但是,json将像这样交付:
它不仅是一个眼睛,如果你然后尝试打印(例如通过console.log
),第2,第8,第11行的那些"""
将成为\"
。 (其他noted)已经questions。要在浏览器中解析json,你需要通过JSON.parse
两次运行它(或者以另一种方式转换转义的字符)。
另一方面,如果我执行以下代码(这是我目前解决问题的方法):
data = list(map(lambda thing: {"pk": thing.pk, <etc>}, self.get_queryset()))
return JsonResponse(data, status=200, safe=False)
这给了我有效的json而没有额外的"
字符(借用猫图片):
我的问题: 显然,浏览器获得了不同的输入。是的,他们都是有效的json(他们通过验证器) - 但是第一个肯定是JSON.parse()
。有没有办法强制核心序列化器符合第二个json输出格式?目前我不得不编写很多样板序列化器代码,这些代码使我的课看起来很乱。
答案 0 :(得分:0)
内置的django序列化程序输出String
。 django JsonpResponse
获取键+值数据并将其与添加的正确HTTP标头进行字符串化。如果您传递字典或列表,那就没问题了,但是如果你传递了一个String
,其中有"
个字符(就像核心序列化程序的输出那样),{{1}快乐地逃脱现有的JsonResponse
,因为你当然不会在未转义的字符串中拥有"
。你的团队合作。
显然,通过对正在发生的事情的深入理解,期望序列化器输出除字符串以外的任何内容有点愚蠢 - 这是串行器的作用,对吗?
那么我想,我可以让JsonResponse编码器在字符串中以某种方式忽略"
吗? JsonResponse in 1.9可以provide encoder arguments。
是的,但没有一个参数包含"
,即使它确实存在,也无法正确解析magically_skip_double_quotes=true
。
在那一点上,你有点意识到你实际上只想:
{"quotation": "\"Fine weather!\" said Bob."}
这可能是解决问题的最简单方法。