Как получить доступ к объекту JSON, сериализованному Django

Я не могу получить доступ к первичному ключу объекта, сериализованного Django в JSON. Мой JavaScript выглядит так:

function makeLink() {
    recorder && recorder.exportWAV(function (blob) {
        let fd = new FormData;
        fd.append("audio", blob);
        let csrftoken = getCookie('csrftoken');
        let xhr = new XMLHttpRequest();
        xhr.onreadystatechange = function() {
            if (this.readyState == 4 && this.status == 200) {
                var obj = JSON.parse(this.responseText);
                /*console.info(obj[0].pk);*/
                document.getElementById("result").innerHTML = obj.data[0]['pk'];
            }
        }

        xhr.open('POST', uploadAudio_url , true)
        //alert(uploadAudio_url)
        xhr.setRequestHeader("X-CSRFToken", csrftoken);
        xhr.onload = function () {
            // __log("Audio Uploaded to server succesfully");
        };
        xhr.onerror = function (e) {
            // __log("Error Uploading audio" + e)
        };

        xhr.send(fd);
    });

}

Я отправляю данные большого двоичного объекта, представляющие собой аудиофайл, для обработки речи в бэкэнде. Бэкэнд обрабатывает аудиофайл и правильно фильтрует объекты. Затем он отвечает клиенту с помощью набора запросов в JSON. Мне интересно получить объекты PK и показать изображения в сетке галереи.

Это мой

Views.py:

def process_speech(recognized_audio):
    speech = recognized_audio
    url = ''  # Is the URL where the user will be redirected once speech is proccessed
    keylist = []
    for key in Keyword.objects.all():
        if (speech.find(key.keyword.lower()) != -1):
            keylist.append(key.keyword)

    print('Identificado Keyword: ', keylist)
    if (speech.find('fotos') != -1 or speech.find('fotografías') != -1):
        print("Reconocido FOTO")
        imagenes_filtered = Imagen.objects.filter(keyword__keyword__in=keylist)
        #print(imagenes_filtered)
        return imagenes_filtered
    if (speech.find('video') != -1):
        print("Reconocido VIDEO")

def upload(request):
    print("Método: ", request.method)
    print("Ajax: ", request.is_ajax())
    if request.method == 'POST':
        if request.FILES.get('audio'):
            record_audio = request.FILES['audio']
            fs = FileSystemStorage()
            filename = fs.save(record_audio.name + ".wav", record_audio)
            uploaded_file_url = fs.url(filename)
            print("File received succesfully")
            speech = decodeSpeech(filename)
            print(speech)
            objects = process_speech(speech)
            data = serializers.serialize('json', objects)
            return HttpResponse(JsonResponse({'data': data}, safe=False),)
        else:
            return render_to_response('index.html', {"errors":"No recognized audio"})
    else:
        return HttpResponseRedirect('/home/')

Я получаю следующие данные Json:

[
    {
     "model": "Galeria.imagen", 
     "pk": 20, 
     "fields": 
                {"image_width": 6000, 
                "image_height": 4000, 
                "fichero_imagen": "files/img/lucas-albuquerque-615558-unsplash.jpg", 
                "keyword": [17, 18]}
    }, 
    {
     "model": "Galeria.imagen", 
     "pk": 21, 
     "fields": 
                {"image_width": 5855, 
                 "image_height": 3860, 
                 "fichero_imagen": "files/img/freestocks-org-794156-unsplash.jpg", 
                 "keyword": [18]}
    }
]

Я пробовал такие вещи, как:

  • obj.data [0] .pk
  • obj.data [0] [pk]
  • obj.data [0]. ['pk']
  • obj.data.pk [0]

и так далее, но я всегда получаю неопределенное значение.

заранее спасибо

Это В самом деле JSON? Есть несоответствия

Randy Casburn 25.11.2018 04:45

Ну, я генерирую его в соответствии с Django Docs о том, как сериализовать объекты, чтобы JSON генерировался Django. Почему это неправильно? Я новичок в JSON.

Antonio Maestre 25.11.2018 04:52

Я не говорю, что это неправильно, я говорю, что вы показываете корень ваших данных JSON в виде массива ([), но вы получаете доступ к проанализированному JSON как obj.data. Так как же выглядит строка JSON полный? Итак, в закомментированном журнале консоли, что вы получите, если вы используете console.info() только obj?

Randy Casburn 25.11.2018 05:23

попробуйте obj.data[0]['pk'] без точки. Может obj.data[0][0]['pk']

Red Cricket 25.11.2018 05:37

Да, и это не json, это список словарей на питоне.

Red Cricket 25.11.2018 06:02

@RedCricket. obj.data [0] [0 ['pk']] возвращает значение undefined.

Antonio Maestre 25.11.2018 06:17

@RandyCasburn. console.info (obj) показывает {данные: "[{" модель ":" Galeria.imagen "," pk ": 20," fields ": {… ocks-org-794156-unsplash.jpg", "ключевое слово": [1 ...

Antonio Maestre 25.11.2018 06:24

obj.data[0]['pk'] пробовали?

Red Cricket 25.11.2018 07:39

в случае успеха вы сможете получить ответ в том же формате, что и в вопросе?

Learner 25.11.2018 10:23

Почему вы вставляете свой JSONResponse(который уже является подклассом класса HttpResponse) в HttpResponse?

Philipp Zettl 25.11.2018 11:02
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
10
1 395
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что вы дважды сериализуете свои данные в JSON. Один раз с data = serializers.serialize('json', objects) и еще раз с JsonResponse({'data': data}). Создание JsonResponse позволяет избежать JSON из первого вызова, превращая список в большую строку.

Вам нужно будет удалить вложенный JsonResponse и напрямую передать JSON.

objects = process_speech(speech)
data = serializers.serialize('json', objects)
return HttpResponse(data)  # Pass the JSON direct to the HttpResponse

Затем вам нужно будет изменить свой Javascript, чтобы он ожидал, что объект верхнего уровня будет списком (без свойства data):

document.getElementById("result").innerHTML = obj[0]['pk'];

Другие вопросы по теме