Маршалинг больших потоков данных в JSON без загрузки в память
Часто возникает необходимость кодировать большие потоки данных в JSON, но загружая весь поток в память сразу может оказаться непрактичным. В этой статье рассматриваются способы решения этой проблемы без встроенного интерфейса json.Marshaler.
Кодирование с помощью json.Encoder: ограничение
Попытки кодировать большой поток данных с помощью json.Encoder выйдет из строя из-за неспособности обрабатывать каналы (строки каналов) в памяти.
Пользовательское кодирование JSON
При отсутствии подходящей встроенной -в решении становится необходимой специальная кодировка JSON. Это предполагает создание строки JSON вручную, как показано в фрагменте ниже:
w := os.Stdout w.WriteString(`{ "Foo": "` t.Foo `", "Bar": [`) for x := range t.Bar { _ = json.NewEncoder(w).Encode(x) w.WriteString(`,`) } w.WriteString(`]}`)
Расширение кодирования/json для поддержки каналов
Чтобы улучшить пакет кодирования/json за счет поддержки каналов, вы можете изменить параметр ReflectValueQuoted функция в кодировке/json/encode.go. В частности, добавьте регистр для каналов, подобный следующему:
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(']')
Заключение
Хотя пакет кодирования/json в настоящее время не поддерживает кодирование каналов, в этой статье представлены альтернативные подходы к маршалированию больших потоков данных. в JSON эффективно. Пользовательское кодирование позволяет передавать данные непосредственно в вывод JSON, а расширение кодирования/json предлагает более надежное решение.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3