как для потоковой передачи объекта в сжатый JSON? - PullRequest
6 голосов
/ 26 марта 2019

В настоящее время способ конвертировать объект в json и gzip это:

jsonBytes, _ := json.Marshal(payload)
//gzip json
var body bytes.Buffer
g := gzip.NewWriter(&body)
g.Write(jsonBytes)
g.Close()

В результате получается промежуточный большой байтовый буфер jsonBytes, единственное назначение которого - преобразовать его в буфер gzip.

Есть ли какой-нибудь способ stream упорядочить объект payload, чтобы он в первую очередь был разархивирован?

1 Ответ

6 голосов
/ 26 марта 2019

Да, вы можете использовать json.Encoder для потоковой передачи выходных данных JSON и аналогично json.Decoder для декодирования потоковых входных данных JSON.Для записи результата JSON в / чтения из них требуются любые io.Writer и io.Reader, включая gzip.Writer и gzip.Reader.

Например:

var body bytes.Buffer
w := gzip.NewWriter(&body)

enc := json.NewEncoder(w)

payload := map[string]interface{}{
    "one": 1, "two": 2,
}
if err := enc.Encode(payload); err != nil {
    panic(err)
}
if err := w.Close(); err != nil {
    panic(err)
}

Чтобы убедиться, что это работает, вот как мы можем его декодировать:

r, err := gzip.NewReader(&body)
if err != nil {
    panic(err)
}
dec := json.NewDecoder(r)
payload = nil
if err := dec.Decode(&payload); err != nil {
    panic(err)
}

fmt.Println("Decoded:", payload)

Что выдаст (попробуйтена игровой площадке Go ):

Decoded: map[one:1 two:2]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...