Marshaling de flux de données volumineux en JSON sans chargement en mémoire
Le besoin d'encoder des flux de données volumineux en JSON se pose souvent, mais le chargement de l'intégralité diffuser en mémoire en même temps peut être peu pratique. Cet article explore les moyens de surmonter ce défi sans l'interface json.Marshaler intégrée.
Encodage avec json.Encoder : une limitation
Tentatives d'encodage d'un flux volumineux de données avec json.Encoder échouera en raison de son incapacité à gérer les canaux (chaîne de canal) en mémoire.
Encodage JSON personnalisé
En l'absence d'un outil intégré approprié -dans la solution, un encodage JSON personnalisé devient nécessaire. Cela implique de créer manuellement la chaîne JSON, comme démontré dans l'extrait ci-dessous :
w := os.Stdout w.WriteString(`{ "Foo": "` + t.Foo + `", "Bar": [`) for x := range t.Bar { _ = json.NewEncoder(w).Encode(x) w.WriteString(`,`) } w.WriteString(`]}`)
Extension d'encoding/json pour la prise en charge des canaux
Pour améliorer le package encoding/json avec la prise en charge des canaux, vous pouvez modifier la fonction reflexValueQuoted dans encoding/json/encode.go. Plus précisément, ajoutez un cas pour les chaînes similaire à celui-ci :
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(']')
Conclusion
Bien que le package encoding/json ne prenne actuellement pas en charge l'encodage des chaînes, cet article fournit approches alternatives pour marshaler efficacement de gros flux de données en JSON. L'encodage personnalisé permet de diffuser des données directement dans la sortie JSON, tandis que l'extension de encoding/json offre une solution plus robuste.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!