Codificando grandes fluxos de dados com MarshalJSON sem carregar todos os objetos na memória
Desejando codificar um grande fluxo de dados usando json.Encoder sem carregar colocar tudo isso na memória de uma vez é um problema comum. Infelizmente, o pacote encoding/json não fornece suporte direto para isso.
Solução alternativa atual
A solução atual, como você mencionou, é construir manualmente a string JSON você mesmo. Isso envolve escrever a estrutura JSON peça por peça, à medida que os dados ficam disponíveis no fluxo. Esta é uma abordagem eficiente, mas pode ser tediosa e propensa a erros.
Patch proposto
Para melhorar este processo, pode-se modificar o pacote encoding/json. Especificamente, a função reflectValueQuoted em encoding/json/encode.go pode ser modificada para lidar com canais como matrizes. Isso permitiria o streaming direto de dados dos canais para a saída JSON.
Aqui está uma alteração proposta para o caso Array em reflectValueQuoted:
case reflect.Array:
e.WriteByte('[')
n := v.Len()
for i := 0; i 0 {
e.WriteByte(',')
}
e.reflectValue(v.Index(i))
}
e.WriteByte(']')
// Add the following case for channels:
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(']')
Benefícios do patch
Este patch tornaria muito mais fácil codificar grandes fluxos de dados sem carregar todos os objetos na memória. Também eliminaria a necessidade de concatenação manual de strings, reduzindo o risco de erros e melhorando a legibilidade do código.
Conclusão
Embora o patch proposto não faça parte do atual encoding/json, ele demonstra uma melhoria potencial que pode tornar o streaming de dados JSON mais eficiente e conveniente.
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