【问题标题】:How access JSON object serialized by DjangoDjango如何访问序列化的JSON对象
【发布时间】:2019-04-27 02:42:15
【问题描述】:

我无法访问由 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 格式的查询集响应客户端。我有兴趣获取对象 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吗?有不一致的地方
  • 好吧,我根据 Django Docs 关于如何序列化对象生成它,因此 JSON 由 Django 生成。为什么是错的?我是 JSON 新手。
  • 我并不是说这是错误的,我是说您将 JSON 数据的根显示为一个数组 ([),但您以 obj.data 访问已解析的 JSON。那么 complete JSON 字符串是什么样的呢?所以在注释掉的控制台日志中,如果你 console.log() 只有 obj,你会得到什么?
  • 试试obj.data[0]['pk'] 没有点。也许obj.data[0][0]['pk']
  • 哦,它不是 json 是一个 python 字典列表。

标签: javascript arrays json ajax django


【解决方案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'];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-27
    • 2012-01-18
    • 2011-01-23
    • 2018-09-12
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 2020-03-04
    相关资源
    最近更新 更多