Marshaling de flux de données volumineux en JSON sans chargement en mémoire
La nécessité 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 de l'encodage/json pour la prise en charge des canaux
Pour améliorer le package d'encodage/json avec la prise en charge des canaux, vous pouvez modifier le refletValueQuoted fonction dans encoding/json/encode.go. Plus précisément, ajoutez un cas pour les canaux semblable à 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 pas actuellement en charge le codage de canal, cet article propose des approches alternatives pour le marshaling de flux de données volumineux. en JSON efficacement. L'encodage personnalisé permet de diffuser des données directement dans la sortie JSON, tandis que l'extension de l'encodage/json offre une solution plus robuste.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3