Marshaling grandes fluxos de dados em JSON sem carregar na memória
A necessidade de codificar grandes fluxos de dados em JSON muitas vezes surge, mas carregar o todo transmitir para a memória de uma só vez pode ser impraticável. Este artigo explora maneiras de superar esse desafio sem a interface json.Marshaler integrada.
Codificação com json.Encoder: uma limitação
Tentativas de codificar um fluxo grande de dados com json.Encoder falhará devido à sua incapacidade de lidar com canais (string chan) na memória.
Codificação JSON personalizada
Na ausência de um -na solução, a codificação JSON personalizada torna-se necessária. Isso envolve a construção manual da string JSON, conforme demonstrado no snippet abaixo:
w := os.Stdout w.WriteString(`{ "Foo": "` t.Foo `", "Bar": [`) for x := range t.Bar { _ = json.NewEncoder(w).Encode(x) w.WriteString(`,`) } w.WriteString(`]}`)
Estendendo codificação/json para suporte de canal
Para aprimorar o pacote encoding/json com suporte de canal, você pode modificar o reflectValueQuoted função em encoding/json/encode.go. Especificamente, adicione um caso para canais semelhante a este:
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(']')
Conclusão
Embora o pacote encoding/json atualmente não suporte codificação de canal, este artigo fornece abordagens alternativas para empacotar grandes fluxos de dados em JSON de forma eficiente. A codificação personalizada permite o streaming de dados diretamente na saída JSON, enquanto a codificação estendida/json oferece uma solução mais robusta.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3