Marshaling großer Datenströme in JSON ohne Laden in den Speicher
Oft entsteht die Notwendigkeit, große Datenströme in JSON zu kodieren, aber das Ganze zu laden Das gleichzeitige Streamen in den Speicher kann unpraktisch sein. In diesem Artikel werden Möglichkeiten untersucht, diese Herausforderung ohne die integrierte json.Marshaler-Schnittstelle zu meistern.
Kodierung mit json.Encoder: Eine Einschränkung
Versuche, einen großen Stream zu kodieren von Daten mit json.Encoder schlägt fehl, da er Kanäle (Chan-String) im Speicher nicht verarbeiten kann.
Benutzerdefinierte JSON-Kodierung
In Ermangelung eines geeigneten Builds -in-Lösung ist eine benutzerdefinierte JSON-Codierung erforderlich. Dazu gehört die manuelle Erstellung der JSON-Zeichenfolge, wie im folgenden Snippet gezeigt:
w := os.Stdout w.WriteString(`{ "Foo": "` t.Foo `", "Bar": [`) for x := range t.Bar { _ = json.NewEncoder(w).Encode(x) w.WriteString(`,`) } w.WriteString(`]}`)
Encoding/JSON für Kanalunterstützung erweitern
Um das Encoding/JSON-Paket mit Kanalunterstützung zu erweitern, können Sie den ReflectValueQuoted ändern Funktion in Encoding/json/encode.go. Fügen Sie insbesondere einen Fall für Kanäle hinzu, der dem folgenden ähnelt:
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(']')
Fazit
Während das Paket „encoding/json“ derzeit keine Kanalkodierung unterstützt, bietet dieser Artikel alternative Ansätze zum Marshallen großer Datenströme in JSON effizient. Mit der benutzerdefinierten Kodierung können Daten direkt in die JSON-Ausgabe gestreamt werden, während die Erweiterung von „encoding/json“ eine robustere Lösung bietet.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3