почему в моем выводе JSON есть как Bunch of backsla sh - PullRequest
0 голосов
/ 24 февраля 2020

Я пытаюсь отправить данные модели как json, используя следующий код

Views.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)

models.py

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

    def __str__(self):
        return self.car_model_new

output:

"[{\"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\"}}]"

почему в моем выводе JSON есть куча backsla sh и как я могу их удалить и Mozilla Firefox default JSON filter также не работает, Я также не могу извлечь данные из него с помощью сценария java (как я могу извлечь данные из некоторого API publi c, поэтому нет проблем с кодом извлечения)

edit:

как я пытаюсь извлечь данные после синтаксического анализа JSON в переменную myArr

const carModelsArr = myArr.data.map((d) => d.fields.car_model_new

edit 2: так что решение не в состоянии использовать вместо

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

использовало это :

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

и извлечение кода может работать

, но, тем не менее, не решает проблему backsla sh, и я хотел бы избежать использования DRF, если это возможно

Ответы [ 2 ]

1 голос
/ 24 февраля 2020

Это из-за JsonResponse. Как вы можете видеть в документации od JsonResponse , он ожидает словарь, и вы уже создали строку JSON. Я предполагаю, что из-за того, что вы сказали safe=False, что она приняла строку.

Я предлагаю заменить ее на DRF Response или проанализировать ее из запроса в Python dict , (Я бы предпочел опцию DRF Response).

Для получения дополнительной информации, пожалуйста, ознакомьтесь с документами в ссылках.

Примечание: я сам не запускал код - это мое предположение.

1 голос
/ 24 февраля 2020

Я думаю, что сериализатор делает это, чтобы заключить двойные кавычки " вокруг объекта dict при преобразовании их в Json объект. Возможно, что объект dict уже имеет либо ключ, либо значение, заключенное в одинаковые двойные кавычки ". Следовательно, backsla sh.

Чтобы избавиться от этого, вы должны использовать json.loads при использовании Python, в противном случае JSON.parse при использовании JS

Python3:

json.loads(response)

JS:

JSON.parse(data)

enter image description here

Редактировать

Вы сериализуете данные дважды, следовательно, вы используете backsla sh, и вы вынуждены использовать JSON.parse дважды. Поскольку вы уже сериализовали ответ, вы можете просто использовать HttpResponse или Response для возврата этих сериализованных данных.

Solution-1 :

from django.http import HttpResponse
return HttpResponse(posts_serialized, content_type='application/json')

Solution-2 :

from rest_framework.response import Response
return Response(posts_serialized, content_type='application/json')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...