wake-up-neo.com

Wie konvertiert man eine Liste von Wörterbüchern nach JSON in Python/Django?

Ich habe bei Google gesucht und eine Antwort gefunden, die für mich nicht funktioniert. Ich muss eine Liste als JsonResponse in Django senden, ähnlich der folgenden:

list_to_json =[{"title": "hello there",
                "link": "www.domain.com",
                "date":   ...},
               {},{},{},...]

Ich konvertiere dies in JSON durch Anwenden von StackOverflow question1 und question2 , aber es funktioniert nicht für mich. Ich erhalte folgende Fehlermeldung:

Um die Serialisierung nichtdiktischer Objekte zu ermöglichen, setzen Sie den sicheren Parameter auf False.

Hier ist mein Code:

    def json_response(request):
        list_to_json=[{"title": ..., "link": ..., "date": ...},{...}]
        return JsonResponse(json.dumps(list_to_json) )
10
shuboy2014
return JsonResponse(list_to_json, safe=False)

Schauen Sie sich die Dokumentation an

Der sichere boolesche Parameter ist standardmäßig auf "True" gesetzt. Wenn es auf False gesetzt ist, kann jedes Objekt zur Serialisierung übergeben werden (ansonsten sind nur Dikt-Instanzen zulässig). Wenn safe wahr ist und ein Nicht-Diktierobjekt als erstes Argument übergeben wird, wird ein TypeError ausgelöst.

21
The Brewmaster

Sie enthalten Serialisierer oder Sie können dies tun, indem Sie für Ihre Antwortdaten safe = False verwenden.
Mögen 

return JsonResponse(list_to_json, safe=False)
1
Projesh Bhoumik

Hinzufügen dieser Antwort für alle, die sich fragen, warum dies standardmäßig nicht "sicher" ist. Das Packen einer Nicht-Diktaten-Datenstruktur in eine Antwort macht den Dienst anfällig für einen JSON-Hijacking-Angriff vor ES5.

Mit der hier verwendeten JSONResponse kann ein Benutzer, der sich für Ihre Site authentifiziert hat, nun die Liste der {title-, link-, date} -Objekte abrufen. Das ist in Ordnung. Ein Angreifer kann diesen Endpunkt jedoch als Skriptquelle auf seiner eigenen böswilligen Seite hinzufügen (Cross Site Script-Inklusion, auch bekannt als XSSI):

<script src="https://www.yourwebsite.com/secretlinks/"></script>

Wenn ein ahnungslos authentifizierter Benutzer zur böswilligen Seite navigiert, fordert der Browser unwissentlich das Datenarray von Ihrer Site an. Da Ihr Dienst nur ein nicht zugewiesenes Array zurückgibt, muss der Angreifer auch den js Array-Konstruktor vergiften (dies ist der Teil des Angriffs, der in ES5 behoben wurde). Vor ES5 kann der Angreifer den Array-Konstruktor einfach wie folgt überschreiben:

Array = function() {secret = this;}

Jetzt enthält secret Ihre Liste der Wörterbücher und ist für den Rest des Angreifers verfügbar, wo er sie an seinen eigenen Server senden kann. In ES5 wurde dies behoben, indem die Verwendung von Klammern vom Standard-Array-Konstruktor erzwungen wurde.

Warum war das nie ein Thema für Wörterbuchobjekte? Einfach, weil geschweifte Klammern in Javascript einen isolierten Gültigkeitsbereich kennzeichnen, und daher gibt es keine Möglichkeit für den Angreifer, seinen eigenen Code in den Gültigkeitsbereich des zurückgegebenen Wörterbuchs einzufügen, das von geschweiften Klammern umgeben ist.

Weitere Informationen finden Sie hier: https://security.stackexchange.com/questions/159609/how-is-it-möglich-zum-nicht-javascript-array-constructor-und-how-does-ecmascrip?newreg=c70030debbca44248f54cec4cdf761bb

0
stackPusher

Dies ist kein gültiges Wörterbuch: 

{"title": , "link" : , "date": }

weil die Werte fehlen .. Wenn Sie versuchen, die fehlenden Werte stattdessen hinzuzufügen, funktioniert es gut

>>> json.dumps([{"title": "hello there", "link": "www.domain.com", "date": 2016}, {}])
'[{"link": "www.domain.com", "date": 2016, "title": "hello there"}, {}]'
0
VHarisop