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.

GoData Fetching

Code

snippet
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)
}