为什么我的 JSON 输出中有一堆反斜杠

Par*_*dav 4 python django json django-models

我正在尝试使用下面的代码将模型数据作为 json 发送

视图.py

def autocomplete(request):
    model = NewCarModel.objects.only('car_model_new')
    print('model is',model)
   # users_list = list(model)
    posts_serialized = serializers.serialize('json', model)
    print('post is',posts_serialized)

    return JsonResponse(posts_serialized,safe=False)

Run Code Online (Sandbox Code Playgroud)

模型.py

class NewCarModel(models.Model):
    car_model_new = models.CharField(max_length=100, unique=True)

    def __str__(self):
        return self.car_model_new
Run Code Online (Sandbox Code Playgroud)

输出:

"[{\"model\": \"core.newcarmodel\", \"pk\": 1, \"fields\": {\"car_model_new\": \"swift\"}}, {\"model\": \"core.newcarmodel\", \"pk\": 2, \"fields\": {\"car_model_new\": \"wagonr\"}}, {\"model\": \"core.newcarmodel\", \"pk\": 3, \"fields\": {\"car_model_new\": \"baleno\"}}, {\"model\": \"core.newcarmodel\", \"pk\": 4, \"fields\": {\"car_model_new\": \"breeza\"}}, {\"model\": \"core.newcarmodel\", \"pk\": 5, \"fields\": {\"car_model_new\": \"spresso\"}}]"
Run Code Online (Sandbox Code Playgroud)

为什么我的 JSON 输出中有一堆反斜杠以及如何删除它们,Mozilla Firefox 默认 JSON 过滤器也不起作用,我也无法使用 java 脚本从中提取数据(因为我能够从一些公共数据中提取数据) API所以提取代码没有问题)

编辑:

我如何在将 JSON 解析为变量 myArr 后尝试提取数据

const carModelsArr = myArr.data.map((d) => d.fields.car_model_new
Run Code Online (Sandbox Code Playgroud)

编辑2:所以无法提取的解决方案是而不是

var myArr = JSON.parse(this.responseText);

Run Code Online (Sandbox Code Playgroud)

用过这个:

var myArr = JSON.parse(JSON.parse(this.responseText));
Run Code Online (Sandbox Code Playgroud)

并且提取代码能够工作

但仍然没有解决反斜杠问题,如果可能的话我想避免使用 DRF

MaN*_*KuR 5

我认为序列化程序这样做是为了"在将 dict 对象转换为 Json 对象时将双引号引起来。可能该 dict 对象已经具有用相同双引号括起来的键或值"。因此就有了这个反斜杠。

要摆脱它,json.loads如果使用Python,则必须使用,否则JSON.parse如果使用JS

Python3:

json.loads(response)
Run Code Online (Sandbox Code Playgroud)

JS:

JSON.parse(data)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

编辑

您将数据序列化两次,因此使用反斜杠,并且您被迫使用JSON.parse两次。由于您已经序列化了响应,因此您可以简单地使用HttpResponseorResponse返回该序列化数据。

解决方案1

from django.http import HttpResponse
return HttpResponse(posts_serialized, content_type='application/json')
Run Code Online (Sandbox Code Playgroud)

解决方案2

from rest_framework.response import Response
return Response(posts_serialized, content_type='application/json')
Run Code Online (Sandbox Code Playgroud)