Streaming JSON Decoder Over a Reader
Decode a stream of JSON values from a reader without buffering the whole payload, using a decoder that reads records one at a time.
Code
package main
import (
"encoding/json"
"fmt"
"io"
"strings"
)
type Event struct {
Type string `json:"type"`
ID int `json:"id"`
}
func decodeStream(stream io.Reader) ([]Event, error) {
decoder := json.NewDecoder(stream)
var events []Event
for {
var event Event
if err := decoder.Decode(&event); err != nil {
if err == io.EOF {
break
}
return nil, fmt.Errorf("decode: %w", err)
}
events = append(events, event)
}
return events, nil
}
func main() {
input := strings.NewReader("{"type":"a","id":1}
{"type":"b","id":2}
")
events, err := decodeStream(input)
if err != nil {
panic(err)
}
fmt.Println(events)
}Report a problem with this exampleOpens a pre-filled issue on GitHub.