Marshaling von JSON-Streams, ohne ganze Objekte zu laden
Ihr Ziel ist es, einen großen Datenstrom zu kodieren, ohne den gesamten Strom im Speicher zu halten. Während JSON ein gängiges Datenformat ist, bietet die json.Marshaler-Schnittstelle der Standardbibliothek keine einfache Möglichkeit, dies zu erreichen.
Benutzerdefinierte String-Erstellung
Derzeit Sie Sie erstellen die JSON-Zeichenfolge manuell mit WriteString, was angesichts des Mangels an integrierter Funktionalität ein sinnvoller Ansatz ist. Diese Methode stellt sicher, dass Sie jeweils nur kleine Datenblöcke verarbeiten.
Kodierung/JSON ändern
Wenn Sie bereit sind, das Kodierungs-/JSON-Paket zu ändern, dann tun Sie das könnte die Funktion „reflectValueQuoted“ patchen, um Kanäle als Arrays zu behandeln. Dies würde es Ihnen ermöglichen, Kanäle zu durchlaufen und ihre Werte zu kodieren, sobald sie verfügbar sind, ohne den gesamten Stream zu puffern.
Code-Patch-Beispiel
Hier ist eine modifizierte Version der Kodierung/ JSON-Code, den Sie verwenden könnten:
<code class="go">// Inside switch: case reflect.Chan: e.WriteByte('[') i := 0 for { x, ok := v.Recv() if !ok { break } if i > 0 { e.WriteByte(',') } e.reflectValue(x) i++ } e.WriteByte(']')</code>
Fazit
Die einzige aktuelle Option zum Marshallen von JSON-Streams, ohne die gesamten Daten zu laden, besteht darin, die Zeichenfolge manuell nach Ihren Wünschen zu erstellen. Ich arbeite gerade am Paket „encoding/json“ oder ändere es. Das Ändern des Pakets erfordert einige Kenntnisse der internen Implementierung und sollte sorgfältig überlegt werden.
Das obige ist der detaillierte Inhalt vonWie werden JSON-Streams gemarshallt, ohne das gesamte Objekt in den Speicher zu laden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!