django.core.serializers中不一致的json序列化程序(未转义的双引号)

时间:2016-10-24 19:51:25

标签: python json django

如果我选择一个简单的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将像这样交付:

bad 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而没有额外的"字符(借用猫图片):

good json

我的问题: 显然,浏览器获得了不同的输入。是的,他们都是有效的json(他们通过验证器) - 但是第一个肯定是JSON.parse()。有没有办法强制核心序列化器符合第二个json输出格式?目前我不得不编写很多样板序列化器代码,这些代码使我的课看起来很乱。

1 个答案:

答案 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."}

这可能是解决问题的最简单方法。