Beachten Sie, dass ich ein spezielles Objekt habe, das eine literale json-Zeichenfolge enthalten kann, die ich als ein Feld in einem größeren JSON-Objekt verwenden möchte, als den literalen Wert selbst (keine Zeichenfolge, die JSON enthält).
Ich möchte einen benutzerdefinierten Encoder schreiben, der dies ermöglicht, zB:
%Vor% Ich glaube nicht, dass die Unterklasse JSONEncoder und das Überschreiben von Standard funktioniert, weil ich bestenfalls dort die Zeichenfolge zurückgeben kann, die das Ergebnis {"a": "{}"}
machen würde.
Das Überschreiben der Codierung scheint auch nicht zu funktionieren, wenn der LiteralJson irgendwo in einem anderen Wörterbuch verschachtelt ist.
Der Hintergrund dafür ist, dass ich, wenn Sie daran interessiert sind, JSON-codierte Werte in einem Cache speichern und es scheint mir eine Verschwendung zu sein, die ganze Zeit zu deserialisieren und dann zu reserialisieren. Es funktioniert so, aber einige dieser Werte sind ziemlich lang und es scheint nur eine riesige Verschwendung.
Der folgende Encoder würde erreichen, was ich mag (scheint aber unnötig langsam):
%Vor%Ich habe gerade festgestellt, dass ich kürzlich eine ähnliche Frage hatte. Die Antwort schlug vor, ein Ersatz-Token zu verwenden.
Es ist möglich, diese Logik mehr oder weniger transparent mit einer benutzerdefinierten JSONEncoder
zu integrieren, die diese Token intern mit einer zufälligen UUID generiert. (Was ich " RawJavaScriptText
" genannt habe, ist das Äquivalent von " LiteralJson
".)
Sie können dann json.dumps(testvar, cls=RawJsJSONEncoder)
direkt verwenden.
Ergebnis (mit Python 2.6 und 2.7):
%Vor%Es scheint mir eine Verschwendung zu sein, zu deserialisieren und dann die ganze Zeit zu reserialisieren.
Es ist verschwenderisch, aber für den Fall, dass jemand nach einer schnellen Lösung sucht, funktioniert dieser Ansatz gut.
Kribbing das Beispiel von Bruno:
%Vor%Ergebnis:
%Vor%