Как получить доступ к объекту JSON, сериализованному Django - PullRequest
0 голосов
/ 25 ноября 2018

Я не могу получить доступ к первичному ключу объекта, сериализованного 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.log(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);
    });

}

Я отправляю данные BLOB-объектов, которые являются аудиофайлами, для обработки речи в серверной части.Серверная часть обрабатывает аудиофайл и правильно фильтрует объекты.Затем он отвечает клиенту с набором запросов в JSON.Я заинтересован в том, чтобы получить объекты ПК и показать изображения в сетке галереи.

Это мой

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]

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

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

1 Ответ

0 голосов
/ 25 ноября 2018

Проблема в том, что вы дважды сериализуете свои данные в 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'];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...